Group-Object
Группы объектов, содержащих одно и то же значение для указанных свойств.
Синтаксис
Group-Object
[-NoElement]
[-AsHashTable]
[-AsString]
[-InputObject <PSObject>]
[[-Property] <Object[]>]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Описание
Командлет Group-Object
отображает объекты в группах на основе значения указанного свойства.
Group-Object
возвращает таблицу с одной строкой для каждого значения свойства и столбца, отображающего количество элементов с этим значением.
Если указать несколько свойств, Group-Object
сначала группировать их по значениям первого свойства, а затем в каждой группе свойств он группировать по значению следующего свойства.
Начиная с PowerShell 7, Group-Object
могут объединять CaseSensitive и параметры AsHashtable для создания хэш-таблицы с учетом регистра. Хэш-ключи таблицы используют сравнения с учетом регистра и вывод объект System.Collections.Hashtable.
Примеры
Пример 1. Группирование файлов по расширению
В этом примере рекурсивно получает файлы в $PSHOME
и группирует их по расширению имени файла. Выходные данные отправляются в командлет Sort-Object
, который сортирует их по файлам подсчета, найденным для данного расширения. Пустой Name представляет каталоги.
В этом примере используется параметр NoElement для пропуска членов группы.
$files = Get-ChildItem -Path $PSHOME -Recurse
$files |
Group-Object -Property extension -NoElement |
Sort-Object -Property Count -Descending
Count Name
----- ----
365 .xml
231 .cdxml
197
169 .ps1xml
142 .txt
114 .psd1
63 .psm1
49 .xsd
36 .dll
15 .mfl
15 .mof
...
Пример 2. Группирование целых чисел по коэффициентам и даже
В этом примере показано, как использовать блоки скриптов в качестве значения параметра свойства
1..20 | Group-Object -Property {$_ % 2}
Count Name Group
----- ---- -----
10 0 {2, 4, 6, 8...}
10 1 {1, 3, 5, 7...}
Пример 3. Группирование хэш-элементов по значению ключа
Начиная с PowerShell 6, Group-Object
поддерживает сортировку хэш-таблицы входных данных по значениям ключей.
В следующем примере группируется массив хэш-хэш-кодов по значению weight
ключа каждого хэш-файла.
В этом примере используется параметр NoElement для пропуска членов группы.
@(
@{ name = 'a' ; weight = 7 }
@{ name = 'b' ; weight = 1 }
@{ name = 'c' ; weight = 3 }
@{ name = 'd' ; weight = 7 }
) | Group-Object -Property weight -NoElement
Count Name
----- ----
1 1
1 3
2 7
Пример 4. Групповые события журнала событий с помощью EntryType
В этом примере отображаются 1000 последних записей в журнале событий системы, сгруппированных по EntryType.
В выходных данных столбец Count представляет количество записей в каждой группе. Столбец имени
Get-WinEvent -LogName System -MaxEvents 1000 | Group-Object -Property LevelDisplayName
Count Name Group
----- ---- -----
153 Error {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
722 Information {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
125 Warning {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
Пример 5. Группирование процессов по классу приоритета
В этом примере показан эффект параметра NoElement. Эти команды группирует процессы на компьютере по классу приоритета.
Первая команда использует командлет Get-Process
для получения процессов на компьютере и отправки объектов вниз по конвейеру.
Group-Object
группит объекты по значению свойства PriorityClass процесса.
Второй пример использует параметр NoElement для удаления членов группы из выходных данных. Результатом является таблица только со значением свойства счетчика
Результаты показаны в следующем примере выходных данных.
Get-Process | Group-Object -Property PriorityClass
Count Name Group
----- ---- -----
55 Normal {System.Diagnostics.Process (AdtAgent), System.Diagnosti...
1 {System.Diagnostics.Process (Idle)}
3 High {System.Diagnostics.Process (Newproc), System.Diagnostic...
2 BelowNormal {System.Diagnostics.Process (winperf),
Get-Process | Group-Object -Property PriorityClass -NoElement
Count Name
----- ----
55 Normal
1
3 High
2 BelowNormal
Пример 6. Группирование процессов по имени
В следующем примере используется Group-Object
для группировки нескольких экземпляров процессов, выполняемых на локальном компьютере.
Where-Object
отображаются процессы с несколькими экземплярами.
Get-Process | Group-Object -Property Name -NoElement | Where-Object {$_.Count -gt 1}
Count Name
----- ----
2 csrss
5 svchost
2 winlogon
2 wmiprvse
Пример 7. Группирование объектов в хэш-таблице
В этом примере используются параметры asHashTable
В результирующей хэш-таблице каждое значение свойства является ключом, а элементы группы — значениями. Так как каждый ключ является свойством хэш-табличного объекта, для отображения значений можно использовать нотацию точек.
Первая команда получает командлеты Get
и Set
в сеансе, группирует их по команде, возвращает группы в виде хэш-таблицы и сохраняет хэш-таблицу в переменной $A
.
Вторая команда отображает хэш-таблицу в $A
. Существует две пары "ключ-значение", одна для командлетов Get
и одна для командлетов Set
.
Третья команда использует нотацию точек,
$A = Get-Command Get-*, Set-* -CommandType cmdlet |
Group-Object -Property Verb -AsHashTable -AsString
$A
Name Value
---- -----
Get {Get-Acl, Get-Alias, Get-AppLockerFileInformation, Get-AppLockerPolicy...}
Set {Set-Acl, Set-Alias, Set-AppBackgroundTaskResourcePolicy, Set-AppLockerPolicy...}
$A.Get
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Acl 7.0.0.0 Microsoft.PowerShell.Security
Cmdlet Get-Alias 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-AppLockerFileInformation 2.0.0.0 AppLocker
Cmdlet Get-AppLockerPolicy 2.0.0.0 AppLocker
...
Пример 8. Создание хэш-таблицы с учетом регистра
В этом примере объединяются параметры CaseSensitive и AsHashTable для создания хэш-таблицы с учетом регистра. Файлы в примере имеют расширения .txt
и .TXT
.
$hash = Get-ChildItem -Path C:\Files |
Group-Object -Property Extension -CaseSensitive -AsHashTable
$hash
Name Value
---- -----
.TXT {C:\Files\File7.TXT, C:\Files\File8.TXT, C:\Files\File9.TXT}
.txt {C:\Files\file1.txt, C:\Files\file2.txt, C:\Files\file3.txt}
Переменная $hash
сохраняет объект System.Collections.Hashtable.
Get-ChildItem
получает имена файлов из каталога C:\Files
и отправляет объекты System.IO.FileInfo вниз конвейера. .txt
и .TXT
.
Параметры
-AsHashTable
Указывает, что этот командлет возвращает группу в виде хэш-таблицы. Ключи хэш-таблицы — это значения свойств, по которым сгруппированы объекты. Значения хэш-таблицы — это объекты, имеющие это значение свойства.
По сути, параметр AsHashTable возвращает каждую хэш-таблицу, в которой каждый ключ является экземпляром сгруппированного объекта. При использовании с параметром AsString ключи в хэш-таблице являются строками.
Начиная с PowerShell 7, чтобы создать хэш-таблицы с учетом регистра, включите CaseSensitive и AsHashtable в команде.
Тип: | SwitchParameter |
Aliases: | AHT |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-AsString
Указывает, что этот командлет преобразует хэш-ключи таблицы в строки. По умолчанию хэш-ключи таблицы являются экземплярами сгруппированного объекта. Этот параметр действителен только при использовании с параметром AsHashTable.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-CaseSensitive
Указывает, что этот командлет делает группирование чувствительным к регистру. Без этого параметра значения свойств объектов в группе могут иметь разные случаи.
Начиная с PowerShell 7, чтобы создать хэш-таблицы с учетом регистра, включите CaseSensitive и AsHashtable в команде.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-Culture
Задает язык и региональные параметры, используемые при сравнении строк.
Тип: | String |
Position: | Named |
Default value: | None |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-InputObject
Указывает объекты для группировки. Введите переменную, содержащую объекты, или введите команду или выражение, которое получает объекты.
При использовании параметра InputObject для отправки коллекции объектов в Group-Object
Group-Object
получает один объект, представляющий коллекцию. В результате она создает одну группу с этим объектом в качестве члена.
Чтобы сгруппировать объекты в коллекции, передайте объекты в Group-Object
.
Тип: | PSObject |
Position: | Named |
Default value: | None |
Обязательно: | False |
Принять входные данные конвейера: | True |
Принять подстановочные знаки: | False |
-NoElement
Указывает, что этот командлет пропускает члены группы из результатов.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-Property
Задает свойства для группировки. Объекты упорядочены в именованные группы на основе значения указанных свойств. Если свойство не указано, объекты группируются по их значению или ToString()
представлению их значения. Выходные данные отсортированы по возрастанию по именам групп.
Значение параметра свойства
- Выражение —
<string>
или<script block>
Дополнительные сведения см. в разделе about_Calculated_Properties.
Тип: | Object[] |
Position: | 0 |
Default value: | None |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
Входные данные
Вы можете передать любой объект в этот командлет.
Выходные данные
По умолчанию этот командлет возвращает объект GroupInfo.
При использовании параметра asHashTable
Примечания
PowerShell включает следующие псевдонимы для Group-Object
:
- Все платформы:
group
Для группирования объектов можно использовать параметр GroupBy командлетов форматирования, например Format-Table
и Format-List
. В отличие от Group-Object
, которая создает одну таблицу со строкой для каждого значения свойства, параметры GroupBy создают таблицу для каждого значения свойства со строкой для каждого элемента, имеющего значение свойства.
Group-Object
не требует, чтобы объекты, сгруппированные, были одинаковыми типами Microsoft .NET.
При группировке объектов различных типов .NET Group-Object
использует следующие правила:
Одинаковые имена и типы свойств.
Если объекты имеют свойство с указанным именем, а значения свойств имеют одинаковый тип .NET, значения свойств группируются по тем же правилам, которые будут использоваться для объектов одного типа.
Одинаковые имена свойств, разные типы.
Если объекты имеют свойство с указанным именем, но значения свойств имеют другой тип .NET в разных объектах,
Group-Object
использует тип .NET первого вхождения свойства в качестве типа .NET для этой группы свойств. Если объект имеет свойство с другим типом, значение свойства преобразуется в тип для этой группы. Если преобразование типов завершается ошибкой, объект не входит в группу.Отсутствующие свойства.
Объекты, у которых нет указанного свойства, нельзя сгруппировать. Объекты, которые не сгруппированы, отображаются в окончательном выводе объекта GroupInfo в группе с именем
AutomationNull.Value
.
Выходные данные отсортированы по возрастанию по именам групп. Элементы, принадлежащие каждой группе, не отсортированы. Они перечислены в том порядке, в котором они были получены.