GridView 中具有多个值的哈希表

Hashtable with multiple values in GridView

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

$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 中将它们显示在总共三列中?

应该是名称、值 1、值 2 ...

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

哈希表不是具有 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 由第一个对象决定将显示哪些属性。