组对象,获取计数
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]
包装。
给定一个包含一些重复项的列表,我可以使用 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]
包装。