Groeperen van objecten in PowerShell: Organiseer uw gegevens

Bij het werken met PowerShell zijn er momenten waarop je moet werken met sets gegevens. We werken met veel bestanden, gebruikersaccounts, virtuele machines en meer. Wanneer je deze verschillende objecten in de console weergeeft, scrollen de objecten één voor één naar beneden op het scherm, zonder rekening te houden met hoe je ze wilt zien. Maar dat is op te lossen! Met behulp van de PowerShell Group-Object cmdlet kun je objecten groeperen. Deze cmdlet gedraagt zich als de SQL GROUP BY statement.

PowerShell heeft een manier om objecten samen te vatten op basis van hun eigenschappen met behulp van de Powershell Group Object cmdlet. Deze cmdlet stelt de scripter in staat om in één oogopslag veel eigenschappen van objecten te bekijken, gegroepeerd.

Latenn we een hoop objecten van hetzelfde type genereren. Deze objecten kunnen van elk type zijn. Voor deze demonstratie zal ik echter System.ServiceProcess.ServiceController-objecten gebruiken die de Get-Service cmdlet retourneert.

Om ervoor te zorgen dat Group-Object zoals verwacht werkt, zorg ervoor dat je alleen objecten van hetzelfde type groepeert. Het is belangrijk dat alle objecten dezelfde eigenschappen hebben.

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

Beheer en rapporteer over Active Directory, Exchange en Microsoft 365 met ManageEngine ADManager Plus. Download de gratis proefversie!

Group-Object zonder parameters

Get-Service geeft alle services op mijn lokale machine terug. Omdat er hier veel services zijn, kan ik geen idee krijgen van hun status, opstarttype en meer. Ik wil deze services eerst groeperen op basis van hun status. Om deze services te groeperen, zal ik alle service-objecten doorpompen naar de cmdlet Group-Object van PowerShell en de eigenschap Status gebruiken.

PS51> $services | Group-Object

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

Merk op dat door alle services naar Powershell Group Object te leiden, je het aantal kunt krijgen. Niet onbelangrijk, maar wel handig.

Objecten groeperen op basis van één eigenschap

Om ze te groeperen op een specifieke eigenschap (status in dit geval) moet ik Group-Object vertellen dat ik wil groeperen op een bepaalde objecteigenschap. Dit wordt gedaan door de parameter Property te gebruiken op Group-Object.

PS51> $services | Group-Object -Property Status

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

Nu zijn we bezig! Ik kan nu zien hoeveel services er tegelijk gestopt en actief zijn. Ik kan hetzelfde doen voor StartType ook.

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

Filteren van Group-Object Output

Misschien wil ik dieper ingaan en de daadwerkelijke services zien in een of meer van deze groepen. Ik kan deze objecten krijgen door te kijken naar de eigenschap Group die wordt teruggegeven door de Powershell group object-opdracht. Het Group-object bevat alle services die zijn gegroepeerd op de waarde van de objecteigenschap. Om alle gestopte services te krijgen als ik groepeer op servicestatus, kan ik de services filteren op basis van de status Stopped en vervolgens het Group-object uitvouwen om al die services te zien.

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

Objecten groeperen op basis van meerdere eigenschappen

Niet alleen kun je objecten op deze manier groeperen op één eigenschap, maar je kunt ook groeperen op meerdere eigenschappen. Misschien wil je alle services zien op basis van hun status en hun starttype. Om dit te doen, hoef ik alleen maar een andere eigenschapsnaam toe te voegen aan de Property-parameter van 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...}

Door een extra eigenschap toe te voegen, kun je in feite een heleboel “en”-scenario’s creëren en groeperen op zoveel eigenschappen als nodig!

Beheer en Rapporteer Active Directory, Exchange en Microsoft 365 met ManageEngine ADManager Plus. Download de gratis proefversie!

Samenvatting

De Group-Object cmdlet is een cmdlet die je helpt om vergelijkbare objecten samen te groeperen op basis van een gemeenschappelijke eigenschap. Het groeperen van objecten op deze manier is handig op veel verschillende manieren. Ik hoop dat door een beetje te leren over hoe de Group-Object cmdlet werkt, je meer ideeën krijgt over hoe je PowerShell-scripts kunt verbeteren en beter kunt maken!

Als je net begint met PowerShell, raad ik je ten zeerste aan om mijn mini-cursus over het bouwen van PowerShell-tools te bekijken!

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