Gruppenobjekte in PowerShell: Organisieren Sie Ihre Daten

Bei der Arbeit mit PowerShell gibt es Zeiten, in denen Sie mit Datensätzen arbeiten müssen. Wir arbeiten mit vielen Dateien, Benutzerkonten, virtuellen Maschinen und mehr. Wenn Sie diese verschiedenen Objekte in der Konsole anzeigen, scrollen die Objekte nacheinander über den Bildschirm, ohne Rücksicht darauf, wie Sie sie sehen möchten. Aber das lässt sich beheben! Mit dem PowerShell-Group-Object-Cmdlet können Sie Objekte gruppieren. Dieses Cmdlet fungiert wie die SQL GROUP BY-Anweisung.

PowerShell bietet eine Möglichkeit, Objekte nach ihren Eigenschaften mithilfe des PowerShell-Gruppenobjekt-Cmdlets zusammenzufassen. Dieses Cmdlet ermöglicht es dem Skriptautor, einen Überblick über viele Objekteigenschaften auf einmal in Gruppen zu erhalten.

Generieren wir eine Reihe von Objekten desselben Typs. Diese Objekte können beliebigen Typs sein. Für diese Demonstration verwende ich jedoch System.ServiceProcess.ServiceController-Objekte, die das Get-Service-Cmdlet zurückgibt.

Um sicherzustellen, dass Group-Object wie erwartet funktioniert, stellen Sie sicher, dass Sie nur Objekte desselben Typs gruppieren. Es ist wichtig, dass alle Objekte dieselben Eigenschaften haben.

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

Verwalten und Berichten Sie über Active Directory, Exchange und Microsoft 365 mit ManageEngine ADManager Plus. Laden Sie die kostenlose Testversion herunter!

Group-Object ohne Parameter

Get-Service gibt alle Dienste auf meinem lokalen Computer zurück. Da es hier viele Dienste gibt, kann ich mir keinen Überblick über ihren Status, den Starttyp und mehr verschaffen. Ich möchte diese Dienste zuerst nach ihrem Status gruppieren. Um diese Dienste zu gruppieren, leite ich alle Dienstobjekte an das PowerShell-Cmdlet Group-Object weiter und verwende die Status-Eigenschaft.

PS51> $services | Group-Object

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

Beachten Sie, dass durch das Leiten aller Dienste an Powershell Group Object Sie die Anzahl erhalten können. Großes Ding, aber nützlich.

Objekte nach einer einzelnen Eigenschaft gruppieren

Um sie nach einer bestimmten Eigenschaft zu gruppieren (in diesem Fall Status), muss ich Group-Object sagen, dass ich nach einer bestimmten Objekteigenschaft gruppieren möchte. Das wird durch Verwendung des Property-Parameters auf Group-Object erreicht.

PS51> $services | Group-Object -Property Status

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

Jetzt wird’s interessant! Ich kann jetzt sehen, wie viele Dienste gleichzeitig angehalten und ausgeführt werden. Das Gleiche kann ich auch für StartType tun.

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

Filterung der Ausgabe von Group-Object

Vielleicht möchte ich genauer hinschauen und die tatsächlichen Dienste in einer oder mehreren dieser Gruppen sehen. Ich kann diese Objekte erhalten, indem ich die Group-Eigenschaft betrachte, die vom PowerShell-Gruppenobjekt-Befehl zurückgegeben wird. Das Group-Objekt enthält alle Dienste, die nach dem gruppierten Objekteigenschaftswert gruppiert sind. Um alle angehaltenen Dienste zu erhalten, wenn ich nach dem Dienststatus gruppieren, kann ich die Dienste nach dem Status Stopped filtern und dann das Group-Objekt erweitern, um all diese Dienste zu sehen.

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

Objekte nach mehreren Eigenschaften gruppieren

Nicht nur, dass Sie Objekte auf einer einzigen Eigenschaft gruppieren können, sondern Sie können sie auch auf mehreren Eigenschaften gruppieren. Vielleicht möchten Sie alle Dienste basierend auf ihrem Status und ihrem Starttyp sehen. Um dies zu tun, muss ich einfach einen weiteren Eigenschaftsnamen zum Property-Parameter von Group-Object hinzufügen.

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

Sie können sehen, dass durch das Hinzufügen einer zusätzlichen Eigenschaft im Grunde genommen eine Vielzahl von „und“-Szenarien erstellt werden können und je nach Bedarf auf beliebig viele Eigenschaften gruppiert werden kann!

Verwalten und Berichten Sie über Active Directory, Exchange und Microsoft 365 mit ManageEngine ADManager Plus. Kostenlose Testversion herunterladen!

Zusammenfassung

Der Group-Object-Cmdlet ist ein Cmdlet, das Ihnen hilft, ähnliche Objekte basierend auf einer gemeinsamen Eigenschaft zusammenzufassen. Das Gruppieren von Objekten auf diese Weise ist auf viele verschiedene Arten nützlich. Ich hoffe, dass Sie durch das Kennenlernen des Group-Object-Cmdlets einige Ideen bekommen, wie Sie PowerShell-Skripte verbessern und besser erstellen können!

Wenn Sie gerade erst mit PowerShell anfangen, ermutige ich Sie sehr, meinen Mini-Kurs zum Erstellen von PowerShell-Tools anzusehen!

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