给定一个包含一些重复项目的列表,我可以使用 Group-Object -AsHashtable
并且我得到一个哈希表,该表似乎具有包含项目名称的键,而值是我不知道的不认识。
所以,给定
$array = [System.Collections.Generic.List[String]]@('A', 'B', 'C', 'B', "c", 'C')
$grouped = $array | Group-Object -AsHashTable
$grouped
将是
Name Value
---- -----
A {A}
B {B, B}
C {C, c, C}
此时我会认为 $grouped['B'].Count
或 $grouped.'B'.Count
会产生正确的计数 2 . 但我得到 0。我错过了什么?
最佳答案
您在 Windows PowerShell 中看到一个错误,该错误已在 PowerShell (Core) 7+ 中得到修复 - 请参阅 GitHub issue #6933了解详情。
解决方法:在 Windows PowerShell 中,始终将 -AsHashTable
与 -AsString
结合使用,即使输入对象或分组属性值已经是 字符串。 帽子的提示 Abraham Zinala .
# Note: .B.Count is equivalent to ['B'].Count
PS> ('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable -AsString).B.Count
2 # OK, thanks to -AsString (not necessary in PowerShell 7+)
这绕过了该错误,该错误在其他方面表现如下:本应成为哈希表键的字符串意外地包装在不可见的 [psobject]
包装器中,它在turn 阻止基于字符串的键查找。
(('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable).B
产生 $null
在 Windows PowerShell 中。)
注意:这意味着如果您希望键的数据类型不是字符串,则您不能在 Windows PowerShell 中使用 -AsHashtable
(例如 [int]
),因为对于此类数据类型,无法绕过不可见的 [psobject]
包装。
关于powershell - 组对象,获取计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70229678/