Objecten uit de pijplijn verwijderen (Where-Object)

In PowerShell genereert en geeft u vaak meer objecten door aan een pijplijn dan u wilt. U kunt de eigenschappen van bepaalde objecten opgeven om weer te geven met behulp van de cmdlets, maar dit helpt niet bij het probleem van het verwijderen van volledige Format-* objecten uit de weergave. Mogelijk wilt u objecten filteren vóór het einde van een pijplijn, zodat u alleen acties kunt uitvoeren op een subset van de aanvankelijk gegenereerde objecten.

PowerShell bevat een cmdlet waarmee u elk object in de pijplijn kunt testen en dit alleen kunt doorgeven aan de pijplijn als het voldoet aan Where-Object een bepaalde testvoorwaarde. Objecten die niet slagen voor de test, worden verwijderd uit de pijplijn. U geeft de testvoorwaarde op als de waarde van de FilterScript-parameter.

Eenvoudige tests uitvoeren met Where-Object

De waarde van FilterScript is een scriptblok - een of meer PowerShell-opdrachten tussen accolades ( ) - dat wordt geëvalueerd {} als waar of onwaar. Deze scriptblokken kunnen heel eenvoudig zijn, maar als u ze maakt, moet u weten wat een ander PowerShell-concept is, vergelijkingsoperators. Een vergelijkingsoperator vergelijkt de items die aan elke zijde ervan worden weergegeven. Vergelijkingsoperators beginnen met een koppelteken ( - ) en worden gevolgd door een naam. Eenvoudige vergelijkingsoperators werken op vrijwel elk soort object. De geavanceerdere vergelijkingsoperators werken mogelijk alleen voor tekst of matrices.

Notitie

Wanneer u met tekst werkt, zijn PowerShell-vergelijkingsoperators standaard niet-gevoelig.

Vanwege parseringsoverwegingen worden symbolen zoals < , en niet gebruikt als > = vergelijkingsoperators. In plaats daarvan bestaan vergelijkingsoperators uit letters. De basisvergelijkingsoperators worden weergegeven in de volgende tabel.

Vergelijkingsoperator Betekenis Voorbeeld (retourneert waar)
-eq is gelijk aan 1 -eq 1
-ne Is niet gelijk aan 1 -ne 2
-lt Is kleiner dan 1 -lt 2
-le Is kleiner dan of gelijk aan 1 -le 2
-gt Is groter dan 2 -gt 1
-ge Is groter dan of gelijk aan 2 -ge 1
-like Is like (vergelijking van jokertekens voor tekst) "file.doc" -like "f*.do?"
-niet-achtig Is not like (vergelijking van jokertekens voor tekst) "file.doc" -notlike "p*.doc"
-contains Contains 1,2,3 -contains 1
-notcontains Bevat niet 1,2,3 -notcontains 4

Where-Object scriptblokken gebruiken de speciale variabele $_ om te verwijzen naar het huidige object in de pijplijn. Hier is een voorbeeld van hoe het werkt. Als u een lijst met getallen hebt en alleen getallen wilt retourneren die kleiner zijn dan 3, kunt u gebruiken om de getallen te filteren door Where-Object het volgende te typen:

1,2,3,4 | Where-Object {$_ -lt 3}
1
2

Filteren op basis van objecteigenschappen

Omdat $_ verwijst naar het huidige pijplijnobject, hebben we toegang tot de eigenschappen ervan voor onze tests.

Als voorbeeld kunnen we de klasse Win32_SystemDriver in WMI bekijken. Een bepaald systeem kan honderden stuurprogramma's hebben, maar misschien bent u alleen geïnteresseerd in een bepaalde set systeem stuurprogramma's, zoals de stuurprogramma's die momenteel worden uitgevoerd. Voor de Win32_SystemDriver is de relevante eigenschap State. U kunt de systeem stuurprogramma's filteren en alleen de stuurprogramma's selecteren die worden uitgevoerd door het volgende te typen:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {$_.State -eq 'Running'}

Dit levert nog steeds een lange lijst op. U kunt filteren om alleen de stuurprogramma's te selecteren die zijn ingesteld om automatisch te starten door ook de waarde StartMode te testen:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media Driver
Name        : AsyncMac
State       : Running
Status      : OK
Started     : True

DisplayName : Audio Stub Driver
Name        : audstub
State       : Running
Status      : OK
Started     : True
...

Dit geeft ons veel informatie die we niet meer nodig hebben, omdat we weten dat de stuurprogramma's worden uitgevoerd. De enige informatie die we op dit moment waarschijnlijk nodig hebben, zijn de naam en de weergavenaam. De volgende opdracht bevat alleen deze twee eigenschappen, wat resulteert in veel eenvoudigere uitvoer:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Manual"} |
      Format-Table -Property Name,DisplayName
Name              DisplayName
----              -----------
AsyncMac               RAS Asynchronous Media Driver
bindflt                Windows Bind Filter Driver
bowser                 Browser
CompositeBus           Composite Bus Enumerator Driver
condrv                 Console Driver
HdAudAddService        Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus               Microsoft UAA Bus Driver for High Definition Audio
HidUsb                 Microsoft HID Class Driver
HTTP                   HTTP Service
igfx                   igfx
IntcDAud               Intel(R) Display Audio
intelppm               Intel Processor Driver
...

De bovenstaande opdracht bevat twee elementen, maar deze kunnen worden uitgedrukt in één element met behulp van de Where-Object Where-Object logische -and operator, zoals:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} |
    Format-Table -Property Name,DisplayName

De logische standaardoperators worden weergegeven in de volgende tabel.

Logische operator Betekenis Voorbeeld (retourneert waar)
-en Logisch en; true als beide zijden waar zijn (1 -eq 1) -and (2 -eq 2)
-of Logisch of; true als beide zijden waar zijn (1 -eq 1) -or (1 -eq 2)
-niet Logisch niet; omgekeerd waar en onwaar -not (1 -eq 2)
! Logisch niet; omgekeerd waar en onwaar !(1 -eq 2)