【问题标题】:Group-Object, get counts组对象,获取计数
【发布时间】:2022-01-10 17:29:26
【问题描述】:

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

【问题讨论】:

  • 嗯,不太清楚为什么这不起作用。同时,在聪明人回答这个问题之前,您可以尝试:$grouped.GetEnumerator().Where{$_.Name -eq 'B'}.Value.Count;)
  • @abraham-zinala,这是一个可行的解决方法,如果它被证明是一个错误,而不是我做错了什么。
  • 嗯.....我使用了-AsString 开关,它给了我正确的结果:$grouped = $array | Group-Object -AsHashTable -AsString; $grouped['b'].Count。猜猜你现在可以这样做。确实很奇怪! @mklement0,对此有何想法?
  • 这显然是 5.1 的一个错误。即使$grouped.ContainsKey('B') 也会产生$false。在 Core 上运行良好。
  • 嗯,这似乎以前已经注意到了,我很惊讶现在才发现这一点。 powershell.one/bugs/windows-powershell/group-object。 @Gordon 我建议您采用经典方法来构建哈希表,以防您不想使用 -AsString 开关,正如 Abraham 指出的那样。使用.GetEnumerator() 即使它有效,也会消除正确hashtable 的所有优良品质(效率)。

标签: powershell hashtable group-object


【解决方案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"

【讨论】:

  • 我相信这只是 Windows PowerShell 中的一个错误,而不是 Core。
  • 对不起,我刚刚看到你在使用 5.2
  • 我最初也没有意识到该错误仅在 Windows PowerShell 中出现。一般来说,如果您无法重现问题,最好通过评论向 OP 寻求澄清,而不是发布适合您的内容作为答案。跨度>
【解决方案2】:

您在 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+)

这绕过了该错误,否则该错误如下所示:本应成为哈希表键的字符串意外包装在 invisible [psobject] 包装器中,这反过来又阻止了基于字符串的键查找.
('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable).B 在 Windows PowerShell 中产生 $null。)

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

【讨论】:

  • 我很难理解我们如何判断string 是否已“隐形包装”,如果我这样做$grouped.Keys.ForEach({ $_ -is [string] }) 我会得到$true。即使我将'A'.PSObjectforeach($key in $grouped.Keys){ $key.PSObject ; break } 进行比较,我也看不出有任何区别。一些见解会很受欢迎。
  • @Santiago,试试-is [psobject]。比较 'foo' -is [psobject]([psobject] 'foo') -is [psobject]。使用-is - 除非您明确测试[psobject] - [psobject] 包装器被忽略,因此([psobject] 'foo') -is [string] 也是为真,因为@987654345 @instance wraps 是一个字符串。
  • 哦,哇,我明白你为什么现在称它为“隐形”了。你太棒了谢谢你!这是否意味着 PowerShell 中的所有数据类型都是 PSObject 的包装实例?很抱歉用这些问题打扰你,但我是一个好奇的人:P
  • 不用担心,@Santiago,他们是很好的问题。答案是包装发生在情景中,虽然它总是应该完全透明(不可见) - 实现细节 - 有时不是:见GitHub issue #5579
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2020-09-22
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多