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