Objetos de grupo en PowerShell: Organiza tus datos

Al trabajar con PowerShell, hay momentos en los que necesitas trabajar con conjuntos de datos. Trabajamos con muchos archivos, cuentas de usuario, máquinas virtuales y más. Cuando se muestran estos diversos objetos en la consola, los objetos se desplazan hacia abajo en la pantalla uno tras otro sin tener en cuenta cómo te gustaría verlos. ¡Pero eso se puede solucionar! Usando el cmdlet Group-Object de PowerShell, puedes agrupar objetos juntos. Este cmdlet actúa como la sentencia GROUP BY de SQL.

PowerShell tiene una forma de resumir objetos por sus propiedades a través del cmdlet Group Object de Powershell. Este cmdlet permite al scripter obtener una vista general de muchas propiedades de objetos a la vez en grupos.

Generemos un montón de objetos del mismo tipo. Estos objetos pueden ser de cualquier tipo. Sin embargo, para esta demostración, utilizaré objetos System.ServiceProcess.ServiceController que devuelve el cmdlet Get-Service.

Para que Group-Object funcione como se espera, asegúrate de agrupar solo objetos del mismo tipo. Es importante que todos los objetos tengan las mismas propiedades.

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

Administra e informa sobre Active Directory, Exchange y Microsoft 365 con ManageEngine ADManager Plus. ¡Descarga la prueba gratuita!

Group-Object sin parámetros

Get-Service devuelve todos los servicios en mi máquina local. Dado que hay muchos servicios aquí, no puedo tener una idea de su estado, tipo de inicio y más. Me gustaría agrupar estos servicios primero por su estado. Para agrupar estos servicios, enviaré todos los objetos de servicio al cmdlet Group-Object de PowerShell y usaré la propiedad Status.

PS51> $services | Group-Object

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

Ten en cuenta que al enviar todos los servicios a Powershell Group Object, puedes obtener el recuento. Gran cosa pero útil.

Agrupación de objetos por una sola propiedad

Para agruparlos por una propiedad específica (estado en este caso) necesito decirle a Group-Object que quiero agrupar en una propiedad de objeto particular. Eso se hace usando el parámetro Property en Group-Object.

PS51> $services | Group-Object -Property Status

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

¡Ahora estamos hablando! Ahora puedo ver cuántos servicios están detenidos y en ejecución al mismo tiempo. Puedo hacer lo mismo para StartType también.

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 la salida de Group-Object

Tal vez quiero profundizar y ver los servicios reales en uno o más de estos grupos. Puedo obtener estos objetos mirando la propiedad Group que devuelve el comando de objeto de grupo de Powershell. El objeto Group contiene todos los servicios que tienen el valor de la propiedad de objeto agrupada. Para obtener todos los servicios detenidos si estoy agrupando por estado de servicio, puedo filtrar los servicios por el estado de Stopped y luego expandir el objeto Group para ver todos esos servicios.

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últiples propiedades

No solo puedes agrupar objetos de esta manera en una sola propiedad, sino que también puedes agrupar en varias propiedades. Quizás te gustaría ver todos los servicios según su estado y su tipo de inicio. Para hacerlo, solo necesito agregar otro nombre de propiedad al parámetro Property en 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...}

Puedes ver que al agregar una propiedad adicional, básicamente puedes crear una serie de escenarios “y” y agrupar según tantas propiedades como sea necesario.

Administra e informa sobre Active Directory, Exchange y Microsoft 365 con ManageEngine ADManager Plus. ¡Descarga la prueba gratuita!

Resumen

El cmdlet Group-Object es un cmdlet que te ayuda a agrupar objetos similares según una propiedad común. Agrupar objetos de esta manera es útil de muchas maneras diferentes. Espero que al aprender un poco sobre cómo funciona el cmdlet Group-Object, obtengas más ideas sobre cómo mejorar y crear mejores scripts de PowerShell.

Si estás empezando con PowerShell, te animo a que eches un vistazo a mi mini-curso sobre la construcción de herramientas en PowerShell.

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