Group-Object
Группирует объекты, в которых указанные свойства имеют одно и то же значение.
Синтаксис
Group-Object [-AsHashTable] [-AsString] [[-Property] <Object[]>] [-CaseSensitive] [-Culture <string>] [-InputObject <psobject>] [-NoElement] [<CommonParameters>]
Описание
Командлет Group-Object отображает объекты в виде групп, построенных на основании значений заданных свойств. Командлет Group-Object возвращает таблицу, каждая строка которой соответствует одному значению свойства, а в столбце отображается количество элементов с этим значением.
Если задать более одного свойства, командлет Group-Object сначала сгруппирует их по значениям первого свойства, а затем, внутри каждой из групп свойств, по значениям следующего свойства.
Параметры
-AsHashTable
Возвращает группу в форме хэш-таблицы. Ключами хэш-таблицы являются значения свойств, по которым группируются объекты. Значениями хэш-таблицы являются объекты, имеющие это значение свойства.
Сам по себе параметр AsHashTable возвращает каждую хэш-таблицу, в которой ключи являются экземплярами группируемых объектов. При использовании с параметром AsString ключи хэш-таблицы являются строками.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
Объект GroupInfo |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-AsString
Преобразует ключи хэш-таблицы в строки. По умолчанию ключами хэш-таблицы являются экземпляры группируемых объектов. Этот параметр допустим только при использовании с параметром AsHashTable.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
Объекты GroupInfo |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-CaseSensitive
Включает группировку с учетом регистра. Без указания этого параметра регистры значений свойств объектов в одной группе могут различаться.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-Culture <string>
Задает культуру, используемую при сравнении строк.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-InputObject <psobject>
Задает объекты, включаемые в группу. Введите переменную, содержащую объекты, либо команду или выражение для получения объектов.
Если для передачи коллекции объектов командлету Group-Object используется параметр InputObject, командлет Group-Object получает один объект, представляющий коллекцию. В результате он создает одну группу, элементом которой является этот объект.
Чтобы сгруппировать объекты в коллекции, передайте их командлету Group-Object с помощью конвейера.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
true (ByValue) |
Принимать подстановочные знаки? |
false |
-NoElement
Исключает элементы группы из результатов.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-Property <Object[]>
Задает свойства для группировки. Объекты объединяются в группы на основании значения заданного свойства.
Значение параметра Property может быть новым вычисляемым свойством. Чтобы создать вычисляемое свойство, создайте хэш-таблицу с ключом Expression, задающим строковое значение или блок скрипта.
Обязательно? |
false |
Позиция? |
1 |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
<CommonParameters>
Данный командлет поддерживает общие параметры -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer и -OutVariable. Дополнительные сведения см. в разделе about_Commonparameters.
Ввод и вывод
Входным типом является тип объектов, которые можно передавать командлету по конвейеру. Возвращаемым типом является тип объектов, возвращаемых командлетом.
Входные данные |
System.Management.Automation.PSObject Любой объект можно передать командлету Group-Object по конвейеру. |
Выходные данные |
Microsoft.PowerShell.Commands.GroupInfo или System.Collections.Hashtable Если задан параметр AsHashTable, командлет Group-Object возвращает хэш-таблицу. В противном случае он возвращает объект GroupInfo. |
Примечания
Для группировки объектов можно также использовать параметр GroupBy командлетов форматирования (например, Format-Table [m2] или Format-List [m2]). В отличие от командлета Group-Object, создающего единую таблицу, в которой каждому значению свойства соответствует отдельная строка, параметры GroupBy создают для каждого значения свойства отдельную таблицу, в строках которой указываются элементы, обладающие свойством с заданным значением.
Командлет Group-Object не требует, чтобы группируемые объекты относились к одному типу Microsoft .NET Framework. При группировке объектов различных типов .NET Framework командлет Group-Object использует следующие правила.
-- Одинаковые имена и типы свойств. Если у объектов имеется свойство с заданным именем, а значения этого свойства относятся к одному типу .NET Framework, значения свойства группируются по тем же правилам, по которым группировались бы объекты одного типа.
-- Одинаковые имена свойств, различные типы. Если у объектов имеется свойство с заданным именем, но значения этих свойств в разных объектах принадлежат к различным типам .NET Framework, командлет Group-Object использует в качестве типа .NET Framework для группы свойств тип первого вхождения данного свойства. Если у объекта имеется свойство другого типа, значение этого свойства преобразуется к типу данной группы. Если преобразование типов выполнить не удается, объект не включается в данную группу.
-- Отсутствующие свойства. Объекты, в которых нет указанного свойства, считаются негруппируемыми. В итоговом объекте GroupInfo такие объекты относятся к группе с именем AutomationNull.Value.
Пример 1
C:\PS>get-childitem *.doc | group-object -property length
Описание
-----------
Эта команда получает DOC-файлы в текущем местоположении, группируя их по размеру.
Пример 2
C:\PS>get-childitem | sort-object -property extension | group-object -property extension
Описание
-----------
Эта команда получает файлы в текущем местоположении, сортирует их по расширению имени файла и группирует их по расширению имени файла. Обратите внимание, что файлы сортируются до группировки.
Пример 3
C:\PS>1..35 | group-object -property {$_ % 2},{$_ % 3}
Описание
-----------
В этом примере показано, как использовать в качестве значения параметра Property блоки скрипта.
Эта команда отображает целые числа от 1 до 35, группируя их по остатку от деления на 2 или 3.
Пример 4
C:\PS>$events = get-eventlog -logname system -newest 1000
C:\PS> $events | group-object -property eventID
Count Name Group
----- ---- -----
44 Information {System.Diagnostics.EventLogEntry,
5 Error {System.Diagnostics.EventLogEntry,
1 Warning {System.Diagnostics.EventLogEntry}
Описание
-----------
Эта команда отображает 1000 последних записей в журнале системных событий, сгруппированных по идентификатору события.
Первая команда получает события с помощью командлета Get-EventLog, а затем с помощью оператора присваивания (=) сохраняет их в переменной $events.
Вторая команда с помощью оператора конвейера (|) передает события из переменной $events в командлет Group-Object. Чтобы указать, что события должны группироваться в соответствии со значением свойства EventID, команда использует параметр Property.
При отображении результатов в столбце Count указывается число элементов в каждой группе, в столбце Name — значения EventID, определяющие группу, а в столбце Group — объекты каждой из групп.
Пример 5
C:\PS>get-process | group-object -property priorityclass
Count Name Group
----- ---- -----
55 Normal {System.Diagnostics.Process (AdtAgent), System.Diagnostics.Process (alg), System.Dia...
1 {System.Diagnostics.Process (Idle)}
3 High {System.Diagnostics.Process (Newproc), System.Diagnostics.Process (winlogon), System.D...
2 BelowNormal {System.Diagnostics.Process (winperf),
C:\PS>get-process | group-object -property company -noelement
Count Name
----- ----
55 Normal
1
3 High
2 BelowNormal
Описание
-----------
В этом примере показано действие параметра NoElement. Эти команды группируют процессы на компьютере по их классу приоритета.
Первая команда с помощью командлета Get-Process получает выполняющиеся на компьютере процессы. С помощью оператора конвейера (|) она передает результаты в командлет Group-Object, который группирует объекты по значению свойства PriorityClass процесса.
Вторая команда идентична первой, но она использует параметр NoElement, чтобы исключить из результатов элементы группы. Результатом выполнения команды является таблица, в которой указаны только имена значений свойства и число соответствующих элементов.
Результаты показаны в следующем примере выходных данных.
Пример 6
C:\PS>get-eventlog -logname system -newest 1000 | group-object -property {$_.TimeWritten - $_.TimeGenerated}
Описание
-----------
Эта команда показывает, как задать значение параметра Property с помощью блока скрипта.
Эта команда отображает 1000 последних записей в журнале системных событий, сгруппированных по интервалу между моментом создания записи и моментом ее сохранения в журнале.
Эта команда с помощью командлета Get-EventLog получает текущие записи из журнала событий. Эти записи передаются командлету Group-Object с помощью оператора конвейера (|). Значение параметра Property указано как блок скрипта (выражение в фигурных скобках). Результатом обработки блока скрипта является интервал между временем создания записи и временем ее сохранения в журнале. Вычисленное значение используется для группировки 1000 последних событий.
Пример 7
C:\PS>get-childitem | group-object extension -noelement
Count Name
----- ----
21
82 .txt
9 .cmd
5 .log
12 .xml
5 .htm
36 .ps1
1 .psc1
3 .exe
6 .csv
1 .psd1
2 .bat
Описание
-----------
Эта команда группирует элементы в текущем каталоге по расширению имени файла. Параметр NoElement используется для исключения элементов групп.
Результаты показаны в следующем примере выходных данных.
Пример 8
C:\PS>"a", "b", "c", "c", "d" | get-unique
a
b
c
d
C:\PS> "a", "b", "c", "c", "d" | group-object -noelement | where {$_.Count -gt 1}
Count Name
----- ----
2 c
C:\PS> get-process | group-object -property Name -noelement | where {$_.count -gt 1}
Count Name
----- ----
2 csrss
5 svchost
2 winlogon
2 wmiprvse
Описание
-----------
В этом примере показано, как находить в коллекции уникальные и неуникальные (повторяющиеся) значения свойств.
Первая команда получает уникальные элементы массива путем передачи массива командлету Get-Unique по конвейеру.
Вторая команда получает неуникальные элементы массива. Она по конвейеру передает массив командлету Group-Object, который группирует объекты по значению. Получаемые группы по конвейеру передаются командлету Where-Object, который выбирает объекты, относящиеся к группам с более чем одним элементом.
Третья команда демонстрирует практическое применение такого подхода. Она использует этот метод для обнаружения на компьютере процессов с одинаковыми именами.
Результаты показаны в следующем примере выходных данных.
Пример 9
C:\PS>$a = get-command get-*, set-* -type cmdlet | group-object -property verb -ashashtable -asstring
C:\PS> $a
Name Value
---- -----
Get {Get-PSCallStack, Get-PSBreakpoint, Get-PSDrive, Get-PSSession...}
Set {Set-Service, Set-StrictMode, Set-PSDebug, Set-PSSessionConfiguration...}
C:\PS> $a.get
CommandType Name Definition
----------- ---- ----------
Cmdlet Get-PSCallStack Get-PSCallStack [-Verbose] [-Debug] [-ErrorAction <ActionPrefer...
Cmdlet Get-PSBreakpoint Get-PSBreakpoint [[-Id] <Int32[]>] [-Verbose] [-Debug] [-ErrorA...
Cmdlet Get-PSDrive Get-PSDrive [[-Name] <String[]>] [-Scope <String>] [-PSProvider...
...
Описание
-----------
В этом примере параметры AsHashTable и AsString используются для возврата групп в хэш-таблице, т. е. в виде набора пар "ключ-значение".
В полученной хэш-таблице каждое значение свойства является ключом, а элементы групп — значениями. Поскольку каждый ключ является свойством объекта хэш-таблицы, для отображения значений можно использовать обращение через точку.
Первая команда получает командлеты Get и Set в сеансе, группирует их по назначению, возвращает группы в виде хэш-таблицы и сохраняет хэш-таблицу в переменной $a.
Вторая команда отображает хэш-таблицу из переменной $a. В ней имеется две пары "ключ-значение": первая для командлетов Get и вторая для командлетов Set.
В третьей команде с помощью обращения через точку отображаются значения ключа Get в переменной $a. Эти значения являются объектами CmdletInfo. Параметр AsString не преобразует объекты в группах в строки.