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=(…)对数据进行转换
在选择对象中
负责使其工作吗?“计算属性是对象的属性,但不是固有的内置属性。相反,它是我们自己创建的属性。”谢谢!