Objetos de Grupo no PowerShell: Organize seus Dados

Ao trabalhar com o PowerShell, há momentos em que você precisa trabalhar com conjuntos de dados. Trabalhamos com muitos arquivos, contas de usuário, máquinas virtuais e muito mais. Quando você exibe esses diversos objetos no console, os objetos são exibidos na tela um após o outro, sem considerar como você gostaria de vê-los. Mas isso pode ser corrigido! Usando o cmdlet Group-Object do PowerShell, você pode agrupar objetos juntos. Este cmdlet funciona como a cláusula GROUP BY do SQL.

O PowerShell tem uma maneira de resumir objetos por suas propriedades através do cmdlet Group Object do PowerShell. Este cmdlet permite que o scripter tenha uma visão geral das propriedades de muitos objetos de uma só 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 Microsoft 365 com o ManageEngine ADManager Plus. Baixe a avaliação gratuita!

Group-Object sem parâmetros

Get-Service retorna todos os serviços na 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 direcionar 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...}

Note que, ao direcionar todos os serviços para 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 de uma só vez. 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 me aprofundar 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 do objeto de grupo 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 várias propriedades

Não apenas é possível agrupar objetos dessa forma em uma única propriedade, mas também é possível agrupar em várias propriedades. Talvez você queira ver todos os serviços com base no seu status e no tipo de inicialização. Para fazer isso, basta 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...}

É possível observar que, adicionando uma propriedade adicional, você pode essencialmente criar vários 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 a versão de avaliação gratuita!

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ê obtenha mais ideias sobre como melhorar e criar scripts PowerShell mais eficientes!

Se você está começando com o PowerShell, recomendo fortemente que confira meu mini-curso sobre construção de ferramentas no PowerShell!

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