Powershell GridView中具有多个值的哈希表

Powershell GridView中具有多个值的哈希表,powershell,gridview,hashtable,Powershell,Gridview,Hashtable,我将数据存储在具有多个值的哈希表中,如下所示: $hash = @{} $folders = dir (...) | where (...) foreach ($folder in $folders) { $num1 = (...) $num2 = (...) $hash.Add($folder.Name,@($num1,$num2)) } $hash | select -Property @{Expression={$_.Name};Label="FolderName

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

$hash = @{}
$folders = dir (...) | where (...)
foreach ($folder in $folders) {
    $num1 = (...)
    $num2 = (...)
    $hash.Add($folder.Name,@($num1,$num2))
}
$hash | select -Property @{Expression={$_.Name};Label="FolderName"},
    @{Expression={$_.Name[0]};Label="num1"},
    @{Expression={$_.Name[1]};Label="num2"} | 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
这是一个散列,其值部分有一个数组。数组总是有两个项目。完成
foreach
部分后,我想用
Out GridView
显示数据,如下所示:

$hash = @{}
$folders = dir (...) | where (...)
foreach ($folder in $folders) {
    $num1 = (...)
    $num2 = (...)
    $hash.Add($folder.Name,@($num1,$num2))
}
$hash | select -Property @{Expression={$_.Name};Label="FolderName"},
    @{Expression={$_.Name[0]};Label="num1"},
    @{Expression={$_.Name[1]};Label="num2"} | 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
但正如你所想象的,这是行不通的。如何将散列值部分中存储的数组拆分为两个新列,以在GridView中总共三列显示它们

应该类似于名称、值1、值2


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

哈希表不是具有
名称
属性的对象列表。这正是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 = @{}
$folders = dir (...) | where (...)
foreach ($folder in $folders) {
    $num1 = (...)
    $num2 = (...)
    $hash.Add($folder.Name,@($num1,$num2))
}
$hash | select -Property @{Expression={$_.Name};Label="FolderName"},
    @{Expression={$_.Name[0]};Label="num1"},
    @{Expression={$_.Name[1]};Label="num2"} | 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会通过第一个对象确定将显示哪些属性。

哈希表不是具有
名称和
值的对象列表。这正是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 = @{}
$folders = dir (...) | where (...)
foreach ($folder in $folders) {
    $num1 = (...)
    $num2 = (...)
    $hash.Add($folder.Name,@($num1,$num2))
}
$hash | select -Property @{Expression={$_.Name};Label="FolderName"},
    @{Expression={$_.Name[0]};Label="num1"},
    @{Expression={$_.Name[1]};Label="num2"} | 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会通过第一个对象确定将显示哪些属性。

此解决方案工作正常,但没有提供有关Hamsibamsti解决方案不工作的原因的信息。您应该详细说明为什么没有名为“Name”的属性,并且他可以使用get-member cmdlet检查$hash的属性。感谢您的帮助。Tom是对的,在第二种方法中,枚举哈希表的键时,使用的是
$hash[$\u][0]
。为什么这在我的方法中不起作用?当我尝试时,它甚至不起作用:
$hash.Keys |选择$hash[$\][0]
。为什么你的方法仍然有效?区别在哪里?在我看来,这是同一段代码?@Hamstibamsti
$\uu.Name[0]
!=<代码>$hash[$\u][0]
$\u0.Name[0]
即使您正在枚举任何内容(您没有枚举),也可能无法工作,因为名称(键)首先不是数组。另外,
$hash[$\u][0]
不是键的属性名称,因此如果要将计算属性与
选择对象
一起使用,则必须使用该属性。再次感谢,因此,通过
选择对象
中的
@{Expression=(…)
对数据进行的转换是使其工作的原因吗?“计算属性是对象的属性,但不是固有的内置属性。相反,它是我们自己创建的属性。”谢谢!此解决方案工作正常,但没有提供有关Hamsibamsti解决方案不起作用的信息。您应该详细说明为什么没有名为“Name”的属性“而且他可以使用get-member cmdlet检查$hash的属性。谢谢你的帮助。Tom是对的,在你的第二种方法中,你枚举哈希表的键,你使用了
$hash[$\][0]
。为什么这在我的方法中不起作用?当我尝试时,它甚至不起作用:
$hash.keys |选择$hash[$][0]
。为什么你的方法仍然有效?区别在哪里?在我看来,这是同一段代码?@hambibamsti
$\uuu.Name[0]
!=
$hash[$\uu][0]
$\uu.Name[0]
即使你列举了任何东西(你没有列举),也不可能有效,因为名称(键)首先不是数组。而且,
$hash[$\u][0]
不是键属性的名称,因此如果要将计算属性与
选择对象一起使用,则必须使用该属性。再次感谢,因此通过
@{Expression=(…)对数据进行转换
选择对象中
负责使其工作吗?“计算属性是对象的属性,但不是固有的内置属性。相反,它是我们自己创建的属性。”谢谢!