Grouper des objets en PowerShell : Organiser vos données

Lorsque vous travaillez avec PowerShell, il arrive parfois que vous ayez besoin de manipuler des ensembles de données. Nous travaillons avec de nombreux fichiers, comptes d’utilisateurs, machines virtuelles, et plus encore. Lorsque vous affichez ces différents objets dans la console, ils défilent à l’écran les uns après les autres sans se soucier de la manière dont vous aimeriez les voir. Mais cela peut être corrigé ! En utilisant la cmdlet Group-Object de PowerShell, vous pouvez regrouper des objets ensemble. Cette cmdlet agit comme la déclaration GROUP BY de SQL.

PowerShell a une façon de résumer les objets par leurs propriétés grâce à la cmdlet Powershell Group Object. Cette cmdlet permet au scripteur d’avoir une vue d’ensemble des propriétés de nombreux objets à la fois par groupes.

Créons un tas d’objets du même type. Ces objets peuvent être de n’importe quel type. Cependant, pour cette démonstration, j’utiliserai des objets System.ServiceProcess.ServiceController que la cmdlet Get-Service retourne.

Pour que Group-Object fonctionne comme prévu, assurez-vous de regrouper uniquement des objets du même type. Il est important que tous les objets aient les mêmes propriétés.

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

Gérez et rappelez-vous de l’Active Directory, d’Exchange et de Microsoft 365 avec ManageEngine ADManager Plus. Téléchargez l’essai gratuit !

Group-Object sans paramètres

Get-Service renvoie tous les services sur ma machine locale. Comme il y a beaucoup de services ici, je ne peux pas avoir une idée de leur état, de leur type de démarrage et plus encore. J’aimerais d’abord regrouper ces services par leur état. Pour regrouper ces services, je vais envoyer tous les objets de service à la commande Group-Object de PowerShell et utiliser la propriété Status.

PS51> $services | Group-Object

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

Remarquez qu’en envoyant tous les services à Powershell Group Object, vous pouvez obtenir le décompte. C’est un gros avantage mais utile.

Regroupement d’objets par une seule propriété

Pour les regrouper par une propriété spécifique (statut dans ce cas), je dois indiquer à Group-Object que je veux regrouper selon une propriété d’objet particulière. Cela se fait en utilisant le paramètre Property sur Group-Object.

PS51> $services | Group-Object -Property Status

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

Maintenant, on parle! Je peux maintenant voir combien de services sont arrêtés et en cours d’exécution en même temps. Je peux faire la même chose pour StartType également.

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

Filtrage de la sortie de Group-Object

Peut-être que je veux plonger et voir les services réels dans un ou plusieurs de ces groupes. Je peux obtenir ces objets en regardant la propriété Group renvoyée par la commande d’objet de groupe PowerShell. L’objet Group contient tous les services regroupés par la valeur de la propriété d’objet. Pour obtenir tous les services arrêtés si je regroupe selon l’état du service, je peux filtrer les services par l’état Stopped et ensuite étendre l’objet Group pour voir tous ces services.

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

Regroupement d’objets par plusieurs propriétés

Pas seulement vous pouvez regrouper des objets de cette manière sur une seule propriété, mais vous pouvez également les regrouper sur plusieurs propriétés. Peut-être aimeriez-vous voir tous les services en fonction de leur statut et de leur type de démarrage. Pour ce faire, il me suffit d’ajouter un autre nom de propriété au paramètre Property de la commande 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...}

Vous pouvez voir qu’en ajoutant une propriété supplémentaire, vous pouvez essentiellement créer une multitude de scénarios « et » et regrouper autant de propriétés que nécessaire!

Gérez et rapportez l’Active Directory, Exchange et Microsoft 365 avec ManageEngine ADManager Plus. Téléchargez l’essai gratuit!

Résumé

La cmdlet Group-Object est une commande qui vous aide à regrouper des objets similaires en fonction d’une propriété commune. Regrouper des objets de cette manière est utile de plusieurs façons. J’espère qu’en apprenant un peu comment fonctionne la cmdlet Group-Object, vous aurez plus d’idées sur la manière d’améliorer et de créer de meilleurs scripts PowerShell!

Si vous débutez avec PowerShell, je vous encourage vivement à consulter mon mini-cours sur la création d’outils PowerShell!

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