Group-Object, получить счет

Учитывая список с некоторыми повторяющимися элементами, я могу использовать 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. Что мне не хватает?

2 ответа

Вы видите ошибку в Windows PowerShell , которая с тех пор была исправлена ​​в PowerShell (Core) 7+ — подробности см. в GitHub issue #6933 .

Обходной путь : в Windows PowerShell всегда комбинируйте -AsHashTableс -AsString, даже если входные объекты или значения свойств группировки уже являются строками. Совет user14903754 .

      # 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+)

Это позволяет обойти ошибку, которая в противном случае проявляется следующим образом: строки, которые должны стать ключами хеш-таблицы, неожиданно заворачиваются в невидимые оболочки , что, в свою очередь, препятствует поиску ключей на основе строк.
( ('A', 'B', 'C', 'B', "c", 'C' | Group-Object -AsHashTable).Bурожаи $nullв Windows PowerShell.)

Примечание: подразумевается, что вы не можете использовать -AsHashtableв Windows PowerShell, если вы хотите, чтобы ключи имели тип данных, отличный от строки (например ,[int]), потому что для таких типов данных невидимый [psobject]обкатку обойти нельзя.

попробуйте ниже (это сработало для меня, см. рис.)

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

Другие вопросы по тегам