0

我正在阅读一篇优秀的文章 Skipping empty CSV objects

我发现这很有启发性,因为它帮助我理解了一些在 PowerShell commandlet 方面让我感到困惑的事情Import-Csv。我有一个问题希望有人能帮助我。请允许我简要介绍一些背景。我确定我错过了一些简单的东西,所以请原谅我。

$csvFileToImport这是我使用导入的一个小 CSV 文件 () 的内容Import-Csv

区域 ID、区域名称
6、《美国东北部》
7、《美国中西部》
8、《南美》
9、《美国西部》

我使用以下方法处理了这个Import-Csv

命令:

$csvFileContent = Import-Csv -Path $csvFileToImport

我检查了这个对象 ( $csvFileContent) 的成员,很明显这$csvFileContent 是一个对象数组:

TypeName: System.Object[]

我验证我可以显示这个数组中的第一个元素:

命令:

Write-Host ("Count of `$csvFileContent = {0}" -f $csvFileContent.Count)

输出:

Count of $csvFileContent = 4

列出返回的对象数组的第一项:

命令:

Write-Host ("`$csvFileContent[0] = {0}"-f $csvFileContent[0])

输出:

$csvFileContent[0] = @{RegionId=6; RegionName=Northeast US}

乍一看,这在我看来就像每个数组元素都包含一个哈希表,但通过检查数组的第一个元素包含的对象详细信息,情况并非如此:

命令:

$arrayElement = $csvFileContent[0]

命令:

Write-Host ("Type of object contained in the array returned from Import-Csv and the object members:")

输出:

TypeName: System.Management.Automation.PSCustomObject

从文章中我能够确定“Value”属性实际上是一个数组:

命令:

$whatIsThisValue = $csvFileContent[0].PSObject.Properties.Value

输出:

TypeName: System.Object[]

同样,按照使用“Value”属性的示例,我可以从数组中提取正确的值:

命令:

Write-Host ("`$csvFileContent[0].PSObject.Properties.Name[0] = {0}, `$csvFileContent[0].PSObject.Properties.Value[0] = {1}" -f $csvFileContent[0].PSObject.Properties.Name[0], $csvFileContent[0].PSObject.Properties.Value[0])

输出:

$csvFileContent[0].PSObject.Properties.Name[0] = RegionId,  $csvFileContent[0].PSObject.Properties.Value[0] = 6

命令:

Write-Host ("`$csvFileContent[0].PSObject.Properties.Name[1] = {0}, `$csvFileContent[0].PSObject.Properties.Value[1] = {1}" -f $csvFileContent[0].PSObject.Properties.Name[1], $csvFileContent[0].PSObject.Properties.Value[1])

输出:

$csvFileContent[0].PSObject.Properties.Name[1] = RegionName, $csvFileContent[0].PSObject.Properties.Value[1] = Northeast US

这是我的问题...

在哪里列出或注明了包含自定义对象的数组元素包含一个“名称”数组的属性和一个“值”数组的属性。我从文章中推断出有一个“价值”属性。我将其称为自定义对象的属性是否正确?在先尝试了其他一些东西(比如“Key”)之后,我能够推断出另一个属性是“Name”。“名称”或“价值”均未列为成员 System.Management.Automation.PSCustomObject

我确定我缺少一些批判性的理解,我希望有人可以帮助我?

提前感谢您的任何建议或帮助。

真挚地,

安德鲁。

4

1 回答 1

0

我觉得你很努力。考虑以下:

$a = "id, region", "6, Northeast US", "7, Midwest US", "8, South US", "9, West US"
$b = ConvertTo-Csv $a
$b | Get-Member

这应该告诉您 $b 是一个 System.Management.Automation.PSCustomObject,带有 NoteProperty 'id' 和 'region'。现在您可以输入

$b[0].region

你应该回到“美国东北部”。您真的不想使用 $b[0].PSObject.Properties.Value[0]。只需使用原始 csv 文件中的“标题名称”。

您可以将任何对象通过管道传输到 Get-Member(或别名“gm”)以了解属性和方法等。花一些时间以交互方式使用 PowerShell,这是非常值得的。

于 2013-11-19T20:42:48.853 回答