PowerShell自定义对象由命令行开关Import-Csv生成

时间:2013-08-29 03:50:47

标签: powershell-v3.0

我正在阅读一篇优秀文章跳过空的CSV对象

我发现这很有启发性,因为它帮助我了解了一些事情 让我对PowerShell命令行开关Import-Csv感到困惑。我有一个 我怀疑有人会帮助我。请允许我简要提供 一些背景。我确信我错过了一些简单的东西,请原谅我。

以下是使用$csvFileToImport导入的小型CSV文件(Import-Csv)的内容:

RegionId,RegionName
6, "Northeast US"
7, "Midwest US"
8, "South US"
9, "West US"

我使用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”),我能够推断出另一个 财产是“名称”。 “名称”或“值”均未列为成员 System.Management.Automation.PSCustomObject

我确信我错过了一些批判性的理解,我希望有人可以帮助我?

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

此致

安德鲁。

1 个答案:

答案 0 :(得分: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,这是值得的。