Grupo de Objetos no PowerShell: Organize Seus Dados

Quando se trabalha com o PowerShell, há momentos em que é necessário lidar com conjuntos de dados. Lidamos com muitos arquivos, contas de usuário, máquinas virtuais e mais. Quando você exibe esses objetos diversos no console, eles são exibidos na tela um após o outro, sem considerar como você gostaria de vê-los. Mas isso é ajustável! Usando o cmdlet Group-Object do PowerShell, é possível agrupar objetos. Este cmdlet funciona como a declaração SQL GROUP BY.

O PowerShell possui uma maneira de resumir objetos por suas propriedades através do cmdlet Powershell Group Object. Esse cmdlet permite ao scripter ter uma visão geral das propriedades de muitos objetos de uma vez, em grupos.

Vamos gerar um monte de objetos do mesmo tipo. Esses objetos podem ser de qualquer tipo. No entanto, para esta demonstração, usarei objetos System.ServiceProcess.ServiceController que o cmdlet Get-Service retorna.

Para que o Group-Object funcione como esperado, certifique-se de agrupar apenas objetos do mesmo tipo. É importante que todos os objetos tenham as mesmas propriedades.

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--

Gerencie e Relate o Active Directory, Exchange e o Microsoft 365 com o ManageEngine ADManager Plus. Baixe a Avaliação Gratuita!

Group-Object sem Parâmetros

O comando Get-Service retorna todos os serviços em minha máquina local. Como há muitos serviços aqui, não consigo ter uma ideia de seu status, tipo de inicialização e mais. Gostaria de agrupar esses serviços primeiro pelo seu status. Para agrupar esses serviços, vou encaminhar todos os objetos de serviço para o cmdlet Group-Object do PowerShell e usar a propriedade Status.

PS51> $services | Group-Object

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

Observe que encaminhando todos os serviços para o Powershell Group Object, você pode obter a contagem. Grande coisa, mas útil.

Agrupando objetos por uma única propriedade

Para agrupá-los por uma propriedade específica (status neste caso), preciso informar ao Group-Object que quero agrupar em uma determinada propriedade do objeto. Isso é feito usando o parâmetro Property no Group-Object.

PS51> $services | Group-Object -Property Status

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

Agora estamos falando! Agora consigo ver quantos serviços estão parados e em execução ao mesmo tempo. Posso fazer o mesmo para StartType também.

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...}

Filtrando a saída do Group-Object

Talvez eu queira mergulhar e ver os serviços reais em um ou mais desses grupos. Posso obter esses objetos olhando para a propriedade Group que é retornada pelo comando de objeto de grupo do PowerShell. O objeto Group contém todos os serviços que foram agrupados pelo valor da propriedade do objeto. Para obter todos os serviços parados se estiver agrupando pelo status do serviço, posso filtrar os serviços pelo status de Stopped e depois expandir o objeto Group para ver todos esses serviços.

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--

Agrupando objetos por múltiplas propriedades

Não só é possível agrupar objetos assim em uma única propriedade, mas também é possível agrupar em várias propriedades também. Talvez você queira ver todos os serviços com base em seu status e seu tipo de inicialização. Para fazer isso, só preciso adicionar outro nome de propriedade ao parâmetro Property no 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...}

Você pode ver que, adicionando uma propriedade adicional, essencialmente você pode criar uma série de cenários “e” e agrupar em quantas propriedades forem necessárias!

Gerencie e Relate o Active Directory, Exchange e o Microsoft 365 com o ManageEngine ADManager Plus. Baixe o teste gratuito!

Resumo

O cmdlet Group-Object é um cmdlet que ajuda a agrupar objetos semelhantes com base em uma propriedade comum. Agrupar objetos dessa forma é útil de muitas maneiras diferentes. Espero que, ao aprender um pouco sobre como o cmdlet Group-Object funciona, você tenha mais ideias sobre como melhorar e criar scripts do PowerShell!

Se você está apenas começando com o PowerShell, eu encorajo fortemente você a conferir meu mini-curso sobre construção de ferramentas no PowerShell!

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