Delen via


Objecten uit de pijplijn verwijderen

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

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

Eenvoudige tests uitvoeren met Where-Object

De waarde van FilterScript is een scriptblok , een of meer PowerShell-opdrachten tussen accolades ({}) die waar of onwaar opleveren. Deze scriptblokken kunnen eenvoudig zijn, maar het maken ervan vereist kennis over een ander PowerShell-concept, vergelijkingsoperatoren. Een vergelijkingsoperator vergelijkt de items die aan elke kant ervan worden weergegeven. Vergelijkingsoperatoren beginnen met een afbreekstreepje (-) en worden gevolgd door een naam. Basisvergelijkingsoperators werken op vrijwel elk soort object. De meer geavanceerde vergelijkingsoperatoren werken mogelijk alleen voor tekst of matrices.

Notitie

PowerShell-vergelijkingsoperatoren zijn standaard niet hoofdlettergevoelig.

Vanwege parseringsoverwegingen worden symbolen zoals <,>en = niet gebruikt als vergelijkingsoperatoren. In plaats daarvan bestaan vergelijkingsoperatoren 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
-Als Is vergelijkbaar (jokertekenvergelijking voor tekst) "file.doc" -like "f*.do?"
-notlike is niet leuk (jokertekenvergelijking voor tekst) "file.doc" -notlike "p*.doc"
-contains Contains 1,2,3 -bevat 1
-notcontains bevat geen 1,2,3 -niet bevat 4

Where-Object Scriptblokken gebruiken de speciale variabele $_ om te verwijzen naar het huidige object in de pijplijn. Hier volgt een voorbeeld van hoe het werkt. Als u een lijst met getallen hebt en alleen de getallen wilt retourneren die kleiner zijn dan 3, kunt Where-Object u de getallen filteren door 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 voor onze tests.

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

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

Dit produceert nog steeds een lange lijst. 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 die 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
...

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

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

De standaard logische operators worden weergegeven in de volgende tabel.

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