Gruppare oggetti in PowerShell: Organizza i tuoi dati

Quando si lavora con PowerShell, ci sono momenti in cui è necessario lavorare con insiemi di dati. Lavoriamo con molti file, account utente, macchine virtuali e altro ancora. Quando si visualizzano questi oggetti diversi nella console, gli oggetti scorrono sullo schermo uno dopo l’altro senza riguardo per come si vorrebbe vederli. Ma questo è risolvibile! Utilizzando il cmdlet PowerShell Group-Object, è possibile raggruppare gli oggetti insieme. Questo cmdlet agisce come la clausola GROUP BY di SQL.

PowerShell ha un modo di riassumere gli oggetti in base alle loro proprietà tramite il cmdlet Group Object di Powershell. Questo cmdlet consente allo scripter di ottenere una panoramica delle proprietà di molti oggetti contemporaneamente in gruppi.

Generiamo un gruppo di oggetti dello stesso tipo. Questi oggetti possono essere di qualsiasi tipo. Tuttavia, per questa dimostrazione, userò oggetti System.ServiceProcess.ServiceController restituiti dal cmdlet Get-Service.

Per far sì che Group-Object funzioni come previsto, assicurarsi di raggruppare solo oggetti dello stesso tipo. È importante che tutti gli oggetti abbiano le stesse proprietà.

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

Gestisci e segnala Active Directory, Exchange e Microsoft 365 con ManageEngine ADManager Plus. Scarica la prova gratuita!

Group-Object senza parametri

Get-Service restituisce tutti i servizi sulla mia macchina locale. Dato che ci sono molti servizi qui, non posso avere un’idea del loro stato, tipo di avvio e altro. Vorrei raggruppare prima questi servizi in base al loro stato. Per raggruppare questi servizi, invierò tutti gli oggetti servizio al cmdlet Group-Object di PowerShell e userò la proprietà Status.

PS51> $services | Group-Object

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

Nota che inviando tutti i servizi a Powershell Group Object, è possibile ottenere il conteggio. Non è una grande novità, ma è utile.

Raggruppando gli oggetti per una singola proprietà

Per raggrupparli in base a una proprietà specifica (in questo caso lo stato), devo dire a Group-Object di raggruppare su una particolare proprietà dell’oggetto. Ciò viene fatto utilizzando il parametro Property su Group-Object.

PS51> $services | Group-Object -Property Status

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

Ecco fatto! Ora posso vedere quanti servizi sono fermi e in esecuzione contemporaneamente. Posso fare lo stesso anche per 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...}

Filtraggio dell’output di Group-Object

Magari voglio approfondire e vedere i servizi effettivi in uno o più di questi gruppi. Posso ottenere questi oggetti guardando la proprietà Group restituita dal comando di raggruppamento di oggetti di Powershell. L’oggetto Group contiene tutti i servizi che hanno il valore della proprietà oggetto raggruppato. Per ottenere tutti i servizi fermi se sto raggruppando per stato del servizio, posso filtrare i servizi per lo stato di Stopped e quindi espandere l’oggetto Group per vedere tutti quei servizi.

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

Raggruppamento di oggetti per più proprietà

Non solo è possibile raggruppare oggetti in questo modo su una singola proprietà, ma è anche possibile raggruppare su più proprietà. Forse vorresti vedere tutti i servizi in base al loro stato e al loro tipo di avvio. Per farlo, è sufficiente aggiungere un altro nome di proprietà al parametro Property su 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...}

Puoi vedere che aggiungendo una proprietà aggiuntiva, puoi creare essenzialmente una serie di scenari “e” e raggruppare quante proprietà sono necessarie!

Gestisci e genera report su Active Directory, Exchange e Microsoft 365 con ManageEngine ADManager Plus. Scarica la versione di prova gratuita!

Riepilogo

Il cmdlet Group-Object è un cmdlet che ti aiuta a raggruppare oggetti simili in base a una proprietà comune. Il raggruppamento degli oggetti in questo modo è utile in molti modi diversi. Spero che imparando un po’ su come funziona il cmdlet Group-Object, avrai più idee su come migliorare e creare script PowerShell migliori!

Se stai iniziando ad utilizzare PowerShell, ti consiglio vivamente di dare un’occhiata al mio mini-corso sulla creazione di strumenti PowerShell!

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