Группировка объектов в PowerShell: Организуйте свои данные

При работе с PowerShell иногда требуется работать с наборами данных. Мы работаем с большим количеством файлов, учетных записей пользователей, виртуальных машин и многим другим. Когда вы отображаете эти различные объекты в консоли, они будут прокручиваться вниз по экрану один за другим без учета вашего желания видеть их определенным образом. Но это можно исправить! Используя cmdlet Group-Object в PowerShell, вы можете группировать объекты вместе. Этот cmdlet действует подобно SQL GROUP BY statement.

PowerShell позволяет суммировать свойства объектов с использованием cmdlet Powershell Group Object. Этот cmdlet позволяет разработчику получить общий обзор множества свойств объектов сразу в группах.

Давайте создадим множество объектов одного типа. Эти объекты могут быть любого типа. Однако для этой демонстрации я буду использовать объекты System.ServiceProcess.ServiceController, возвращаемые cmdlet Get-Service.

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

PS51> $services = Get-Service
PS51> $services

Status   Name               DisplayName
------   ----               -----------
Stopped  AdtAgent           Microsoft Monitoring Agent Audit Fo...
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
--snip--

Управляйте и отчетливо отображайте информацию о домене Active Directory, Exchange и Microsoft 365 с помощью ManageEngine ADManager Plus. Загрузите бесплатную версию для испытаний!

Group-Object без параметров

Get-Service возвращает все службы на моем локальном компьютере. Поскольку здесь много служб, я не могу получить представление о их состоянии, типе запуска и других параметрах. Я бы хотел сначала сгруппировать эти службы по их состоянию. Чтобы сгруппировать эти службы, я направлю все объекты служб к командлету Group-Object PowerShell и использую свойство Status.

PS51> $services | Group-Object

Count Name                      Group
----- ----                      -----
  272 AdtAgent                  {AdtAgent, AJRouter, ALG, AppHostSvc...}

Обратите внимание, что, направив все службы к Powershell Group Object, вы можете получить количество. Это большое дело, но полезное.

Группировка объектов по одному свойству

Чтобы сгруппировать их по конкретному свойству (в данном случае – по состоянию), мне нужно сказать Group-Object, что я хочу сгруппировать по определенному свойству объекта. Это делается с помощью параметра Property на Group-Object.

PS51> $services | Group-Object -Property Status

Count Name                      Grou
----- ----                      -----
  160 Stopped                   {AdtAgent, AJRouter, ALG, AppIDSvc...}
  112 Running                   {AppHostSvc, Appinfo, Appveyor.Server, AudioEndpointBuilder...}

Теперь мы говорим! Теперь я могу увидеть, сколько служб остановлено и запущено одновременно. То же самое я могу сделать и для StartType.

PS51> $services | Group-Object -Property StartType

Count Name                      Group
----- ----                      -----
    9 Disabled                  {AdtAgent, AppVClient, NetTcpPortSharing, RemoteAccess...}
  184 Manual                    {AJRouter, ALG, AppIDSvc, Appinfo...}
   79 Automatic                 {AppHostSvc, Appveyor.Server, AudioEndpointBuilder, Audiosrv...}

Фильтрация вывода Group-Object

Возможно, я хочу углубиться и посмотреть на фактические службы в одной или нескольких из этих групп. Я могу получить эти объекты, посмотрев на свойство Group, возвращаемое командой Powershell group object. Объект Group содержит все службы, сгруппированные по значению свойства объекта. Чтобы получить все остановленные службы, если я группирую по статусу службы, я могу отфильтровать службы по статусу Stopped и затем развернуть объект Group, чтобы увидеть все эти службы.

PS51> $services | Group-Object -Property Status | Where {$_.Name -eq 'Stopped'} | Select -ExpandProperty Group

Status   Name               DisplayName
------   ----               -----------
Stopped  AdtAgent           Microsoft Monitoring Agent Audit Fo...
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
Stopped  AppMgmt            Application Management
Stopped  AppReadiness       App Readiness
--snip--

Группировка объектов по нескольким свойствам

Не только можно группировать объекты таким образом по одному свойству, но также можно группировать их по нескольким свойствам. Возможно, вам хотелось бы увидеть все службы в зависимости от их статуса и типа запуска. Для этого мне просто нужно добавить еще одно имя свойства к параметру Property в команде Group-Object.

PS51> $services | Group-Object -Property Status,StartType

Count Name                      Group
----- ----                      -----
    9 Stopped, Disabled         {AdtAgent, AppVClient, NetTcpPortSharing, RemoteAccess...}
  145 Stopped, Manual           {AJRouter, ALG, AppIDSvc, AppMgmt...}
   73 Running, Automatic        {AppHostSvc, Appveyor.Server, AudioEndpointBuilder, Audiosrv...}
   39 Running, Manual           {Appinfo, camsvc, CertPropSvc, ClipSVC...}
    6 Stopped, Automatic        {gpsvc, MapsBroker, sppsvc, TrustedInstaller...}

Вы можете видеть, что добавляя дополнительное свойство, вы фактически можете создавать множество сценариев “и” и группировать по стольким свойствам, сколько необходимо!

Управляйте и создавайте отчеты о службах Active Directory, Exchange и Microsoft 365 с помощью ManageEngine ADManager Plus. Загрузите бесплатную пробную версию!

Сводка

Команда Group-Object – это команда, которая помогает группировать похожие объекты на основе общего свойства. Группировка объектов таким образом пригодится во многих различных ситуациях. Надеюсь, изучив немного о том, как работает команда Group-Object, вы получите больше идей по улучшению и созданию более эффективных сценариев PowerShell!

Если вы только начинаете работать с PowerShell, я настоятельно рекомендую вам ознакомиться с моим мини-курсом по созданию инструментов PowerShell!

Source:
https://adamtheautomator.com/powershell-group-object/