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


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

В этом примере используется параметр 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. Группирование целых чисел по коэффициентам и даже

В этом примере показано, как использовать блоки скриптов в качестве значения параметра свойства . Эта команда отображает целые числа от 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 представляет количество записей в каждой группе. Столбец имени представляет значения 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 для удаления членов группы из выходных данных. Результатом является таблица только со значением свойства счетчика и 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 AsHashTable и AsString для возврата групп в хэш-таблице в виде коллекции пар "ключ-значение".

В результирующей хэш-таблице каждое значение свойства является ключом, а элементы группы — значениями. Так как каждый ключ является свойством хэш-табличного объекта, для отображения значений можно использовать нотацию точек.

Первая команда получает командлеты Get и Set в сеансе, группирует их по команде, возвращает группы в виде хэш-таблицы и сохраняет хэш-таблицу в переменной $A.

Вторая команда отображает хэш-таблицу в $A. Существует две пары "ключ-значение", одна для командлетов Get и одна для командлетов Set.

Третья команда использует нотацию точек, для отображения значений ключа в . Значения представляют собой объект Командлет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 вниз конвейера. группит объекты с помощью значения свойства extension. Параметры 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-ObjectGroup-Object получает один объект, представляющий коллекцию. В результате она создает одну группу с этим объектом в качестве члена.

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

Тип:PSObject
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-NoElement

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

Тип:SwitchParameter
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Property

Задает свойства для группировки. Объекты упорядочены в именованные группы на основе значения указанных свойств. Если свойство не указано, объекты группируются по их значению или ToString() представлению их значения. Выходные данные отсортированы по возрастанию по именам групп.

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

  • Выражение — <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. При группировке объектов различных типов .NET Group-Object использует следующие правила:

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

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

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

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

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

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

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