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 командлет , который сортирует их по количеству файлов, найденных для данного расширения. Пустое имя представляет каталоги.

В этом примере используется параметр 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. Группирование событий журнала событий по EntryType

В этом примере отображаются 1000 последних записей в журнале системных событий, сгруппированных по Типу записи.

В выходных данных столбец Count представляет количество записей в каждой группе. Столбец Имя представляет значения EventType , определяющие группу. Столбец Группа представляет объекты в каждой группе.

Get-WinEvent -LogName System -MaxEvents 1000 | Group-Object -Property LevelDisplayName

Count Name          Group
----- ----          -----
  153 Error         {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics...}
  722 Information   {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics...}
  125 Warning       {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics...}

Пример 4. Группирование процессов по классу приоритета

В этом примере демонстрируется влияние параметра 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

Пример 5. Группирование процессов по имени

В следующем примере используется для 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

Пример 6. Группировка объектов в хэш-таблице

В этом примере используются параметры 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
...

Пример 7. Create хэш-таблицы с учетом регистра

В этом примере объединяются параметры 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 .

Type:SwitchParameter
Aliases:AHT
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-AsString

Указывает, что этот командлет преобразует ключи хэш-таблицы в строки. По умолчанию ключами хэш-таблицы являются экземпляры группируемых объектов. Этот параметр действителен только при использовании с параметром AsHashTable .

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CaseSensitive

Указывает, что этот командлет учитывает регистр группировки. Без этого параметра в группу будут включаться значения свойств в разных регистрах.

Начиная с PowerShell 7, чтобы создавать хэш-таблицы с учетом регистра, включите в команду CaseSensitive и AsHashtable .

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

Задает язык и региональные параметры. которые будут использоваться при сравнении строк.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Задает объекты, которые будут включаться в группу. Введите переменную, которая содержит объекты, или команду или выражение, которое возвращает объекты.

При использовании параметра InputObject для отправки коллекции объектов Group-Objectв получает Group-Object один объект, представляющий коллекцию. В результате командлет создает одну группу, в которую входит этот объект.

Чтобы сгруппировать объекты в коллекции, передайте их по конвейеру в Group-Object.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-NoElement

Указывает, что этот командлет пропускает членов группы из результатов.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Определяет свойства для группирования. Объекты объединяются в группы на основании значения заданного свойства.

Значение параметра Property может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хэш-таблицей. Допустимые пары "ключ-значение":

  • Выражение — <string> или <script block>

Дополнительные сведения см. в разделе about_Calculated_Properties.

Type:Object[]
Position:0
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Входные данные

PSObject

Вы можете передать любой объект в Group-Object.

Выходные данные

Microsoft.PowerShell.Commands.GroupInfo or System.Collections.Hashtable

При использовании параметра Group-ObjectAsHashTable возвращает объект Hashtable. В противном случае возвращается объект GroupInfo .

Примечания

Для группировки объектов можно использовать параметр GroupBy командлетов форматирования, таких как Format-Table и Format-List. В отличие от Group-Object, который создает одну таблицу со строкой для каждого значения свойства, параметры GroupBy создают таблицу для каждого значения свойства со строкой для каждого элемента, имеющего значение свойства.

Group-Object не требует, чтобы сгруппированные объекты были одного типа Microsoft .NET Core. При группировке объектов разных типов Group-Object .NET Core используются следующие правила:

  • Одинаковые имена и типы свойств.

    Если у объектов есть свойство с указанным именем, а значения свойств имеют один и тот же тип .NET Core, значения свойств группируются по тем же правилам, которые будут использоваться для объектов того же типа.

  • Одинаковые имена свойств, разные типы.

    Если у объектов есть свойство с указанным именем, но значения свойств имеют другой тип .NET Core в разных объектах, Group-Object использует тип .NET Core первого вхождения свойства в качестве типа .NET Core для этой группы свойств. Если у объекта имеется свойство другого типа, значение этого свойства преобразуется в тип данной группы. Если преобразование типа завершается сбоем, объект не включается в группу.

  • Отсутствующие свойства.

    Объекты, у которых нет указанного свойства, не могут быть сгруппированы. Объекты, которые не сгруппированы, отображаются в выходных данных окончательного объекта GroupInfo в группе с именем AutomationNull.Value.