在GridView中具有多个值的Hashtable

时间:2016-05-30 13:59:38

标签: powershell gridview hashtable

我将数据存储在具有多个值的哈希表中,如下所示:

$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 ......

然后将多个项目存储在哈希表中作为多行。

1 个答案:

答案 0 :(得分:1)

哈希表不是具有NameValue属性的对象列表。这就是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根据第一个对象确定将显示哪些属性。