Group-Object (Microsoft.PowerShell.Utility)
Group-Object
- Модуль:
- Microsoft.PowerShell.Utility
Группирует объекты, содержащие одинаковое значение для указанных свойств.
Синтаксис
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, который сортирует их по количеству файлов, найденных для данного расширения. Пустое Имя представляет каталоги.
В этом примере используется параметр 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. Группировка целых чисел по четам и нечетам
В этом примере показано, как использовать блоки скриптов в качестве значения параметра Property. Эта команда отображает целые числа от 1 до 20, сгруппированные по чету и нечетности.
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. Группировка событий журнала событий по типу записи.
В этом примере отображаются 1000 последних записей в журнале системных событий, сгруппированные по EntryType.
В выходных данных столбец Count представляет количество записей в каждой группе. Столбец Имя представляет значения EventType, определяющие группу. Столбец Группа представляет объекты в каждой группе.
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 для удаления членов группы из выходных данных. Результатом является таблица, содержащая только значения свойств Count и Name.
Результаты показаны в следующем примере выходных данных.
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 и AsString для возврата групп в хэш-таблице в виде коллекции пар ключ-значение.
В полученной хеш-таблице каждое значение свойства является ключом, а элементы группы — значениями. Поскольку каждый ключ является свойством объекта хеш-таблицы, для отображения значений можно использовать точечную нотацию.
Первая команда получает командлеты Get и Set в сеансе, группирует их по командам, возвращает группы в виде хеш-таблицы и сохраняет хеш-таблицу в . Переменная $A.
Вторая команда отображает хеш-таблицу в $A. Существует две пары ключ-значение: одна для командлетов Get и одна для командлетов Set.
Третья команда использует точечную нотацию $A.Get для отображения значений ключа Get в $A. Значения представляют собой объект CmdletInfo. Параметр AsString не преобразует объекты в группах в строки.
$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 по конвейеру. Group-Object группирует объекты, используя значение Property Extension. Параметры CaseSensitive и AsHashTable создают хеш-таблицу, а ключи группируются с использованием чувствительных к регистру ключей .txt и .TXT.
Параметры
-AsHashTable
Указывает, что этот командлет возвращает группу в виде хеш-таблицы. Ключами хеш-таблицы являются значения свойств, по которым группируются объекты. Значения хэш-таблицы — это объекты, имеющие это значение свойства.
Сам по себе параметр AsHashTable возвращает каждую хеш-таблицу, в которой каждый ключ является экземпляром сгруппированного объекта. При использовании с параметром AsString ключи в хеш-таблице представляют собой строки.
Начиная с PowerShell 7, для создания хэш-таблиц с учетом регистра включите в свою команду CaseSensitive и AsHashtable.
- Тип :
SwitchParameter
- Псевдонимы:
AHT
- Позиция:
Именованный
- Значение по умолчанию:
False
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-AsString
Указывает, что этот командлет преобразует ключи хэш-таблицы в строки. По умолчанию ключи хэш-таблицы являются экземплярами сгруппированного объекта. Этот параметр действителен только при использовании с параметром AsHashTable.
- Тип :
SwitchParameter
- Позиция:
Именованный
- Значение по умолчанию:
False
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-CaseSensitive
Указывает, что этот командлет делает группировку чувствительной к регистру. Без этого параметра значения свойств объектов в группе могут иметь разные регистры.
Начиная с PowerShell 7, для создания хэш-таблиц с учетом регистра включите в свою команду CaseSensitive и AsHashtable.
- Тип :
SwitchParameter
- Позиция:
Именованный
- Значение по умолчанию:
False
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-Culture
Указывает язык и региональные параметры, которые будут использоваться при сравнении строк.
- Тип :
String
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-InputObject
Указывает объекты для группировки. Введите переменную, содержащую объекты, или введите команду или выражение, позволяющее получить объекты.
Когда вы используете параметр InputObject для отправки коллекции объектов в Group-Object, Group-Object получает один объект, представляющий коллекцию. В результате создается одна группа, членом которой является этот объект.
Чтобы сгруппировать объекты в коллекции, передайте их в Group-Object.
- Тип :
PSОбъект
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
True
- Принимайте подстановочные знаки:
False
-NoElement
Указывает, что этот командлет исключает членов группы из результатов.
- Тип :
SwitchParameter
- Позиция:
Именованный
- Значение по умолчанию:
False
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-Property
Указывает свойства для группировки. Объекты группируются в именованные группы на основе значений указанных свойств. Если свойство не указано, объекты группируются по их значению или по представлению их значения в ToString(). Вывод сортируется в порядке возрастания имен групп.
Значение параметра Property может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хеш-таблицей. Допустимые пары ключ-значение:
- Выражение —
<string>или<script; block>
Дополнительные сведения см. в разделе about_Calculated_Properties.
- Тип :
Object[]
- Позиция:
0
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
Входы
PSObject
В этот командлет можно передать любой объект.
Выходы
Информация о группе
По умолчанию этот командлет возвращает объект GroupInfo.
Хеш-таблица
При использовании параметра AsHashTable этот командлет возвращает объект Hashtable.
Примечания
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.
Вывод сортируется в порядке возрастания имен групп. Элементы, принадлежащие каждой группе, не сортируются. Они перечислены в том порядке, в котором они были получены.