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