2

我正在使用 PowerShell v2 并使用如下代码定义了一个名为 Material 的自定义类型:

add-type @"
public struct Material {
    public string BusinessUnit;
    public string Source;
    public string PrimarySource;
    public string LegacyMaterialNumber;
}
"@

...并且我有一个此类对象的集合,我正在使用 Export-Csv cmdlet 将其写入 CSV 文件。这可以正常工作并生成具有如下指定的原始类型的数据:

#TYPE Material          
BusinessUnit,Source,PrimarySource,LegacyMaterialNumber
BU1,NAFO,NAFO-FG,17502
BU1,NAFO,NAFO-FG,17504
BU1,NAFO,NAFO-FG,17739
BU1,NAFO,NAFO-FG,17837
BU1,NAFO,NAFO-FG,17841

我遇到的问题是当我使用Import-Csv将这些数据导入回来时,每行都创建为以下类型:

CSV:Material

...而不是我开始使用的原始类型:

Material

在我的具体情况下,这是一个问题,因为我想将每个 Material 传递给一个函数,其参数专门键入为Material。当然,我可以解析每一行并用数据重建我的 Material 对象,但是有没有一种快速的方法可以将 CSV 数据作为原始类型导入?

4

2 回答 2

2

Import-Csv想要创建一个PSObject基于类型。您可以创建转换函数(或过滤器)以转换为材质类型。然后将输出通过管道import-csv传输到此函数并输入您的目标数组:

filter convert-csvToMaterial([Parameter(Mandatory=$true,ValueFromPipeline=$true)]$csvMaterial)
{
    $material = new-object -TypeName Material 
    $material.BusinessUnit = $csvMaterial.BusinessUnit
    $material.LegacyMaterialNumber = $csvMaterial.LegacyMaterialNumber
    $material.PrimarySource = $csvMaterial.PrimarySource
    $material.Source = $csvMaterial.Source
    $material
}

$importedMaterial = import-csv .\materialList.csv | convert-csvToMaterial
于 2013-07-26T01:09:57.600 回答
0

另一种选择是从返回的自定义对象动态创建一个哈希表,Import-Csv并将它们用作以下-Property参数New-Object

filter Convert-CsvToType( [string]$TypeName ) {
  $_.PSObject.Properties |
    foreach { $h = @{} } {
      $h[$_.Name] = $_.Value
    } { New-Object $TypeName -Property $h }
}

Import-Csv .\materialList.csv | Convert-CsvToType Material
于 2013-08-01T13:37:10.230 回答