组对象,获取计数

Group-Object, get counts

给定一个包含一些重复项的列表,我可以使用 Group-Object -AsHashtable 并得到一个散列 table,它似乎具有包含项名称的键,而值是我不知道的认识。

所以,给定

$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。我错过了什么?

请注意,这是在 PowerShell 版本 7.2 而不是版本 5 上完成的,这就是问题所在。 2021 年 12 月 05 日

试试下面的方法(对我有用,见图)

$array = [System.Collections.Generic.List[String]]@('A', 'B', 'C', 'B', "c", 'C')
$grouped = $array | Group-Object -AsHashTable
$grouped.B 
$grouped.B.Count

Write-Host $grouped.B.Count

$b = $grouped.B.Count
Write-Host "The Number of Values in Column B Is - $b"

您在 Windows PowerShell 中发现了一个 错误,此错误已在 PowerShell 中修复(核心)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+)

这绕过了 bug,否则表现为如下:本应成为哈希表键的字符串意外地包装在 不可见的 [psobject] 包装器 中turn 防止基于字符串的键查找。
('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable).B 在 Windows PowerShell 中产生 $null。)

注意:这意味着 如果您希望键的数据类型不是字符串,则不能在 Windows PowerShell 中使用 -AsHashtable (例如 [int]),因为对于此类数据类型,无法绕过不可见的 [psobject] 包装。