3

给定一个包含一些重复项目的列表,我可以使用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。我错过了什么?

4

2 回答 2

2

您会看到Windows PowerShell中的一个错误,该错误已在PowerShell (Core) 7+中得到修复- 有关详细信息,请参阅GitHub 问题 #6933

解决方法:在 Windows PowerShell 中,始终与 结合-AsHashTable使用-AsString,即使输入对象或分组属性值已经字符串。亚伯拉罕·齐纳拉致敬

# 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]包装器中,这反过来又阻止了基于字符串的键查找。
(在 Windows PowerShell 中('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable).B产生。)$null

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

于 2021-12-04T22:07:21.753 回答
-1

请注意,这是在 PowerShell 版本 7.2 而不是版本 5 上完成的,这是问题所在。05.12.2021

试试下面的(它对我有用,见图片)

$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"

在此处输入图像描述

于 2021-12-04T22:00:41.063 回答