Поделиться через


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

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

PSObject

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

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

GroupInfo

По умолчанию этот командлет возвращает объект GroupInfo .

Hashtable

При использовании параметра 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.

Выходные данные отсортированы по возрастанию по именам групп. Элементы, принадлежащие каждой группе, не отсортированы. Они перечислены в том порядке, в котором они были получены.