我将数据存储在具有多个值的哈希表中,如下所示:
$hash = @{}
$folders = dir (...) | where (...)
foreach ($folder in $folders) {
$num1 = (...)
$num2 = (...)
$hash.Add($folder.Name,@($num1,$num2))
}
所以这是一个在其值部分中带有数组的哈希。该阵列总是有两个项目。完成foreach
部分后,我想用Out-GridView
这样显示数据:
$hash | select -Property @{Expression={$_.Name};Label="FolderName"},
@{Expression={$_.Name[0]};Label="num1"},
@{Expression={$_.Name[1]};Label="num2"} | Out-GridView
但是你可以想象,这不起作用。如何将哈希值部分中存储的数组拆分为两个新列,以便在GridView的整个三列中显示它们?
应该是Name,Value1,Value2 ......
然后将多个项目存储在哈希表中作为多行。
答案 0 :(得分:1)
哈希表不是具有Name
和Value
属性的对象列表。这就是PowerShell为方便起见而显示数据结构的方式。为了按照您尝试的方式处理哈希表,您需要一个枚举器来生成这样的对象:
$hash.GetEnumerator() |
Select-Object @{n='FolderName';e={$_.Name}},
@{n='num1';e={$_.Value[0]}},
@{n='num2';e={$_.Value[1]}} |
Out-GridView
或者您可以枚举哈希表的键,将它们用作管道中的当前对象,并按相应的键和索引查找值:
$hash.Keys |
Select-Object @{n='FolderName';e={$_}},
@{n='num1';e={$hash[$_][0]}},
@{n='num2';e={$hash[$_][1]}} |
Out-GridView
如果您事先不知道数组元素的数量,则需要一个内部循环来处理嵌套数组,例如:像这样:
$hash.Keys | ForEach-Object {
$o = New-Object -Type PSObject -Property @{ 'FolderName' = $_ }
$a = $hash[$_]
for ($i = 1; $i -le $a.Count; $i++) {
$o | Add-Member -Type NoteProperty -Name "num$i" -Value $a[$i-1]
}
$o
} | Out-GridView
如果您有可变数量的数组元素,请注意PowerShell根据第一个对象确定将显示哪些属性。