Group-Object
Группирует объекты, в которых указанные свойства имеют одно и то же значение.
Синтаксис
Group-Object
[-NoElement]
[-AsHashTable]
[-AsString]
[-InputObject <PSObject>]
[[-Property] <Object[]>]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Описание
Командлет Group-Object
отображает объекты в группах на основе значения указанного свойства.
Group-Object
возвращает таблицу с одной строкой для каждого значения свойства и столбца, отображающего количество элементов с этим значением.
Если указать несколько свойств, Group-Object
сначала группируйте их по значениям первого свойства, а затем в каждой группе свойств он группировать по значению следующего свойства.
Начиная с PowerShell 7, можно объединить параметры CaseSensitive и AsHashtable для создания хэш-таблицы с Group-Object
учетом регистра. Хэш-ключи таблицы используют сравнения с учетом регистра и вывод объекта 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. Групповые события журнала событий с помощью EntryType
В этом примере отображаются 1000 последних записей в журнале событий системы, сгруппированных по EntryType.
В выходных данных столбец Count представляет количество записей в каждой группе. Столбец Name представляет значения 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
. Значения — объект КомандлетInfo . Параметр 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
группит объекты с помощью расширения значения свойства. Параметры CaseSensitive и AsHashTable создают хэш-таблицу и ключи группируются с помощью ключей .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()
представлению их значения. Выходные данные отсортированы по возрастанию по именам групп.
Значение параметра Property может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хэш-таблицей. Допустимые пары "ключ-значение":
- Выражение —
<string>
или<script block>
Дополнительные сведения см. в about_Calculated_Properties.
Тип: | Object[] |
Position: | 0 |
Default value: | None |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
Входные данные
Вы можете передать любой объект в этот командлет.
Выходные данные
По умолчанию этот командлет возвращает объект GroupInfo .
При использовании параметра AsHashTable этот командлет возвращает объект Hashtable.
Примечания
PowerShell включает следующие псевдонимы для Group-Object
:
- Все платформы:
group
Для группирования объектов можно использовать параметр GroupBy командлетов форматирования, например Format-Table
и Format-List
.. В отличие Group-Object
от того, что создает отдельную таблицу со строкой для каждого значения свойства, параметры GroupBy создают таблицу для каждого значения свойства со строкой для каждого элемента, имеющего значение свойства.
Group-Object
Не требуется, чтобы объекты, сгруппированные, были одинаковыми типами Microsoft .NET.
При группировке объектов разных типов Group-Object
.NET используются следующие правила:
Одинаковые имена и типы свойств.
Если объекты имеют свойство с указанным именем, а значения свойств имеют одинаковый тип .NET, значения свойств группируются по тем же правилам, которые будут использоваться для объектов одного типа.
Одинаковые имена свойств, разные типы.
Если объекты имеют свойство с указанным именем, но значения свойств имеют другой тип .NET в разных объектах,
Group-Object
использует тип .NET первого вхождения свойства в качестве типа .NET для этой группы свойств. Если у объекта имеется свойство другого типа, значение этого свойства преобразуется в тип данной группы. Если преобразование типов завершается ошибкой, объект не входит в группу.Отсутствующие свойства.
Объекты, у которых нет указанного свойства, нельзя сгруппировать. Объекты, которые не сгруппированы, отображаются в выходных данных объекта GroupInfo в группе с именем
AutomationNull.Value
.
Выходные данные отсортированы по возрастанию по именам групп. Элементы, принадлежащие каждой группе, не отсортированы. Они перечислены в том порядке, в котором они были получены.
Связанные ссылки
PowerShell