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


Group-Object

Группы объектов, содержащих одно и то же значение для указанных свойств.

Синтаксис

HashTable

Group-Object
    [[-Property] <Object[]>]
    [-NoElement]
    [-AsHashTable]
    [-AsString]
    [-InputObject <PSObject>]
    [-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.

Третья команда использует нотацию точек, $A.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 группит объекты с помощью значения свойства extension. Параметры CaseSensitive и AsHashTable создают хэш-таблицу и ключи группируются с помощью ключей с учетом регистра .txt и .TXT.

Параметры

-AsHashTable

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

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

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False
Aliases:AHT

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-AsString

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-CaseSensitive

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

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Culture

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

Свойства параметра

Тип:String
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-InputObject

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

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

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

Свойства параметра

Тип:PSObject
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:True
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-NoElement

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Property

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

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

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

См. раздел about_Calculated_Propertiesдля получения дополнительных сведений.

Свойства параметра

Тип:

Object[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:0
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

CommonParameters

Этот командлет поддерживает общие параметры: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction и -WarningVariable. Дополнительные сведения см. в разделе about_CommonParameters.

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

PSObject

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

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

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.

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