Beheersing van PowerShell Where-Object: Een uitgebreide gids

Wanneer je werkt met eigenschapswaarden in een verzameling objecten in PowerShell, heb je soms een manier nodig om alle dingen die je niet nodig hebt te filteren. Weten hoe je de PowerShell Where-Object cmdlet moet gebruiken, is een belangrijke vaardigheid om te hebben in je PowerShell gereedschapskist.

De Where-Object cmdlet is een handige manier om objecten te filteren. In deze tutorial leer je verschillende manieren om een Where-Object opdracht te construeren, de beschikbare parameters, syntaxis, evenals hoe je meerdere voorwaarden kunt gebruiken als een professional!

Vereisten

Er is slechts één vereiste voor dit artikel. Je moet enige basiskennis hebben van PowerShell-opdrachten en syntaxis.

Alle voorbeelden in dit artikel zijn gebaseerd op de huidige stabiele release van PowerShell (7.1.0 op het moment van schrijven). Maar zolang je Windows PowerShell 4.0 en hoger hebt, zullen de opdrachten hetzelfde werken.

Begrijpen hoe PowerShell Where-Object werkt

Het enige doel van de PowerShell Where-Object cmdlet is om de output van een opdracht te filteren, zodat alleen de informatie die je wilt zien, wordt weergegeven.

In een notendop is de Where-Object cmdlet een filter; dat is alles. Het stelt je in staat om een voorwaarde te construeren die waar of onwaar retourneert. Afhankelijk van het resultaat van die voorwaarde geeft de cmdlet vervolgens de output terug of niet.

Je kunt die voorwaarde op twee manieren formuleren; de “oude” manier met scriptblokken en de “nieuwe” manier met behulp van parameters of vergelijkingsinstructies.

Filtervoorwaarden maken met scriptblokken

Scriptblokken zijn een essentieel onderdeel van PowerShell. Scriptblokken worden op honderden plaatsen in de taal gebruikt. Een scriptblok is een anonieme functie. Het is een manier om code te compartmentaliseren en deze op verschillende plaatsen uit te voeren. Je kunt een filter bouwen voor Where-Object via een scriptblok.

Om een scriptblok als filter te gebruiken, zou je de parameter FilterScript gebruiken. Met deze parameter kun je een scriptblok maken en doorgeven aan de parameter FilterScript, die vervolgens wordt uitgevoerd.

Als het scriptblok een waarde retourneert die geen boolean False of null-variabele is, wordt dit als True beschouwd. Zo niet, dan wordt het als False beschouwd.

Stel bijvoorbeeld dat je alle Windows-services wilt vinden die momenteel een opstarttype van Automatisch hebben. Je zou eerst alle huidige services verzamelen met Get-Service. Get-Service retourneert vervolgens vele verschillende service-objecten met verschillende eigenschappen.

Met behulp van de PowerShell-pijplijn kunt u deze objecten doorgeven aan de cmdlet Where-Object en de parameter FilterScript gebruiken. Aangezien de parameter FilterScript een scriptblok accepteert, kunt u een voorwaarde maken om te controleren of de eigenschap StartType van elk object gelijk is aan Automatic zoals hieronder.

{$_.StartType -EQ 'Automatic'}

Nadat u het filteringscriptblok hebt, geeft u dat scriptblok op aan de parameter FilterScript. Where-Object voert dat scriptblok vervolgens uit voor elk object dat over de pijplijn komt en evalueert elke eigenschap StartType. Als de eigenschap gelijk is aan Automatic, geeft Where-Object het object door. Zo niet, dan wordt het object verwijderd.

U kunt hieronder een eenvoudig voorbeeld zien van deze methodologie.

Get-Service | Where-Object -FilterScript {$_.StartType -EQ 'Automatic'}
Script Block construct

Veel mensen gebruiken positionele parameters met de cmdlet Where-Object en voegen de naam van de parameter FilterScript niet toe. In plaats daarvan verstrekken ze eenvoudig het scriptblok alleen, zoals Where-Object {$_.StartType -eq 'Automatic'}.

Hoewel dit type constructie werkt voor dit specifieke scenario, maakt het concept van een scriptblok met de accolades of zelfs de pijplijnvariabele $_ de code minder leesbaar en moeilijker voor minder ervaren PowerShell-gebruikers. Dit leesbaarheidsprobleem is wat het PowerShell-team ertoe heeft aangezet parameters of vergelijkingsverklaringen te introduceren.

Geïntroduceerd in Windows PowerShell 3.0, hebben vergelijkingsverklaringen meer van een natuurlijke stroom in hoe ze zijn geconstrueerd. Met hetzelfde scenario als in het vorige voorbeeld, laten we de constructie van de vergelijkingsverklaring gebruiken om alle Windows-diensten te vinden met een Automatisch opstarttype:

Get-Service | Where-Object -Property StartType -EQ 'Automatic'

Merk op dat in plaats van een scriptblok te gebruiken, het commando het objecteigenschap specificeert als een parameterwaarde voor de Property parameter. De eq operator is nu ook een parameter waardoor je de waarde van Automatisch aan het kan doorgeven.

Het gebruik van parameters op deze manier elimineert nu de behoefte aan een scriptblok volledig.

A scriptblock is a better choice when defining more complex filtering conditions. The Property parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!

In het volgende gedeelte leer je over de beschikbare vergelijkingsoperator typen die kunnen worden gebruikt met Where-Object om alle dingen te filteren.

Filtering Basisprincipes

Met behulp van parameters filtert Where-Object verzamelingen van objecten met behulp van gangbare vergelijkingsoperatoren. Laten we in enkele voorbeelden duiken om te zien hoe ze werken.

Bevatting Operatoren

Bevatting operatoren zijn nuttig bij het werken met verzamelingen. Bevatting operatoren stellen je in staat om een voorwaarde te definiëren of een verzameling een item bevat of niet.

Als een voorbeeld, laten we zeggen dat je wilt filteren op een bepaalde eigenschapswaarde in een verzameling. Je zou bevatting operatoren kunnen gebruiken.

In PowerShell zul je een paar verschillende bevatting operatoren vinden:

  • -contains / -ccontains – Filter een verzameling die een eigenschapswaarde bevat.
  • -notcontains / -cnotcontains – Filter een verzameling die de waarde van een eigenschap niet bevat.
  • -in / -cin – waarde is in een verzameling, retourneert de eigenschapswaarde als er een overeenkomst is gevonden.
  • -notin / -cnotin – waarde is niet in een verzameling, null/$false als er geen eigenschapswaarde is.

Voor hoofdlettergevoeligheid, gebruik containment-operatoren die beginnen met -c[operator]

Gerelateerd: Begrijp PowerShell Vergelijkingsoperatoren aan de hand van voorbeelden

Zeg dat je de status van de BITS Windows-service wilt controleren. Je kunt dit doen met de contains-parameter (operator) door de waarde van BITS eraan door te geven, zoals hieronder.

Get-Service | Where-Object -Property Name -Contains 'BITS'

En hieronder is wat je zou verwachten te zien:

Where-Object equivalent to Get-Service -ServiceName ‘BITS’

Onthoud altijd om naar links te filteren! Het vorige voorbeeld komt overeen met het uitvoeren van Get-Service -ServiceName 'BITS'.

Misschien wil je wat geavanceerder gaan en alle services vinden met een Status die niet Running is en een StartType die in een enkele tekenreeks (of kan een array zijn) met de naam Manual. Met behulp van een scriptblock hieronder gebruikt het commando de FilterScript-parameter om een scriptblock door te geven die beide voorwaarden evalueert.

Gerelateerd: Terug naar de basis: Begrijp PowerShell-objecten

Get-Service |
	Where-Object {($_.Status -notcontains 'Running') -and ($_.StartType -in 'Manual')}

Wanneer u bovenstaand commando uitvoert, ziet u alleen services die zijn gestopt en een StartType hebben van Manual.

More advanced filtering of a collection of objects

Filteren met containment-operators werkt goed met collecties die veel eigenschapswaarden bevatten. Gezien het aantal eigenschappen dat Get-Service retourneert, wordt filteren door al deze eigenschappen eenvoudiger wanneer u containment- en logische operators combineert.

Overeenkomende Operators

Vergelijkbaar met hoe u containment-operators gebruikt met Where-Object, kunt u ook overeenkomstige operators gebruiken. Overeenkomstige operators stellen u in staat om strings binnenin strings te matchen. Bijvoorbeeld, 'foofoo' -like '*foo*' retourneert True, of 'foofoo' -match 'foo' retourneert True. Overeenkomstige operators matchen strings in strings.

In PowerShell hebt u een paar verschillende overeenkomstige operators die u kunt gebruiken binnen Where-Object.

  • -like / -clike – string komt overeen met een wildcard-patroon.
  • -notlike / -cnotlike – string komt niet overeen met wildcard-patroon.
  • -match / -cmatch – string komt overeen met regex-patroon.
  • -notmatch / -cnotmatch – string komt niet overeen met regex-patroon

Voor hoofdlettergevoeligheid gebruikt u overeenkomstige operators die beginnen met -c[operator]

Bijna identiek aan de vorm van containment-operatoren, kunt u overeenkomende operatoren gebruiken zoals hieronder getoond. Het onderstaande voorbeeld vindt alle services die Windows hebben in de waarde van de eigenschap DisplayName.

Get-Service | Where-Object { $_.DisplayName -match 'Windows'}
The match operator uses regular expressions to match on certain values.

Gerelateerd: Aan de slag met PowerShell en Regex

U kunt ook de like-operator gebruiken om gebruikelijke overeenkomende technieken te gebruiken, zoals het gebruik van een wildcard (*) om elk karakter te matchen of misschien een ? om een enkel karakter te matchen.

Get-Service | Where-Object {($_.Name -like 'Win*')}

De resultaten zijn nu gefilterd om alleen die servicenamen weer te geven met ‘Win‘ als de eerste drie karakters:

service names with ‘Win

Het gebruik van de wildcard betekent dat u de volledige naam van de service niet hoeft te kennen. Enkele letters van de tekenreeks zijn alles wat nodig is. Deze operatoren kunnen ook worden gecombineerd met logische operatoren om het filteren nog verder te verbeteren.

Equality Operators

Vergelijkbaar met hoe u containment- en vergelijkingsoperatoren gebruikt, kunt u ook gelijkheidsoperatoren gebruiken met Where-Object. Gelijkheidsoperatoren zijn nuttig wanneer u numerieke waarden moet vergelijken.

Bijvoorbeeld, 1 -eq 1 zou Waar zijn terwijl 1 -gt 2 onwaar zou zijn. PowerShell heeft vele verschillende gelijkheidsoperatoren die u kunt gebruiken als Where-Object-parameters of binnen conditionele scriptblokken.

  • -eq / -ceq – waarde gelijk aan gespecificeerde waarde.
  • -ne / -cne – waarde niet gelijk aan opgegeven waarde.
  • -gt / -cgt – waarde groter dan opgegeven waarde.
  • -ge / -cge – waarde groter dan of gelijk aan opgegeven waarde.
  • -lt / -clt – waarde kleiner dan opgegeven waarde.
  • -le / -cle – waarde kleiner dan of gelijk aan opgegeven waarde.

Bijvoorbeeld, misschien wilt u alle actieve processen vinden die tussen de twee en tien procent van uw CPU in beslag nemen. Geen probleem met de Get-Process en Where-Object PowerShell cmdlets.

Met behulp van een scriptblok kunt u twee voorwaarden combineren met de and operator die ze beide zal evalueren. Als ze allebei True retourneren, geeft Where-Object het procesobject terug dat over de pijplijn is doorgegeven. Als ten minste een van de voorwaarden False retourneert, laat Where-Object het object vallen.

Get-Process | Where-Object {($_.CPU -gt 2.0) -and ($_.CPU -lt 10)}

Dit is wat u zou verwachten te zien:

Filtering with greater than and less than

Filteren met behulp van Where-Object gelijkheid operatoren zal u helpen bij het opbouwen van systeemrapporten of voor het vergelijken van waarden.

Volgende stappen

Nu je meer weet over hoe je de PowerShell Where-Object cmdlet kunt gebruiken om alles te filteren, wat kun je nog meer doen? Probeer wat meer complexe filtertaken uit te voeren met behulp van meerdere voorwaarden en operators op collecties om eigenschapswaarden te filteren en de uitvoer naar wens op te maken.

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