- 12/23/2019
- 4 minuten om te lezen
-
- j
- s
- m
In PowerShell, genereer en geef je vaak meer objecten door aan een pijplijn dan je wilt. U kunt de eigenschappen van bepaalde objecten specificeren om weer te geven met behulp van de Format-*
cmdlets, maar dit helpt niet bij het probleem van het verwijderen van hele objecten uit de weergave. Mogelijk wilt u objecten filteren voor het einde van een pijplijn, zodat u acties kunt uitvoeren op slechts een subset van de initieel gegenereerde objecten.
PowerShell bevat een Where-Object
cmdlet waarmee u elk object in de pijplijn kunt testen en het alleen door de pijplijn kunt laten gaan als het aan een bepaalde testvoorwaarde voldoet. Objecten die niet aan de test voldoen, worden uit de pijplijn verwijderd. U geeft de testvoorwaarde op als de waarde van de parameterFilterScript.
Eenvoudige tests uitvoeren met Where-Object
De waarde van FilterScript is een scriptblok – een of meer PowerShell-opdrachten omgeven door accolades ({}
) – dat op true of false wordt geëvalueerd. Deze scriptblokken kunnen heel eenvoudig zijn, maar om ze te maken moet je een ander PowerShell-concept kennen, namelijk vergelijkingsoperatoren. Een vergelijkingsoperator vergelijkt de items die aan weerszijden ervan staan. Vergelijkingsoperatoren beginnen met een koppelteken (-
) en worden gevolgd door een naam. Basisvergelijkingsoperatoren werken op bijna elk soort object. De meer geavanceerde vergelijkingsoperatoren werken mogelijk alleen op tekst of arrays.
Note
Bij het werken met tekst zijn de PowerShell-vergelijkingsoperatoren standaard hoofdletterongevoelig.
Om redenen van parsing worden symbolen als <
,>
en =
niet gebruikt als vergelijkingsoperatoren. In plaats daarvan bestaan de vergelijkingsoperatoren uit letters. De basisvergelijkingsoperatoren worden in de volgende tabel opgesomd.
Vergelijkingsoperator | Betekenis | Voorbeeld (geeft waar weer) |
---|---|---|
-eq | 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 als (wildcard vergelijking voor tekst) | “file.doc” -zoals “f*.do?” |
-notlike | is niet als (jokertekenvergelijking voor tekst) | “file.doc” -notlike “p*.doc” |
-contains | Bevat | 1,2,3 -bevat 1 |
-notcontains | bevat geen | 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 die getallen wilt terugzenden die kleiner zijn dan 3, kunt u Where-Object
gebruiken om de getallen te filteren door te typen:
1,2,3,4 | Where-Object {$_ -lt 3}12
Filtering op basis van objecteigenschappen
Nadat $_
verwijst naar het huidige pijplijnobject, kunnen we toegang krijgen tot de eigenschappen ervan voor onze tests.
Als voorbeeld kunnen we kijken naar de Win32_SystemDriver klasse in WMI. Er kunnen honderden systeemdrivers op een bepaald systeem zijn, maar u bent misschien alleen geïnteresseerd in een bepaalde set van de systeemdrivers, zoals die welke momenteel worden uitgevoerd. Voor de Win32_SystemDriver klasse is de relevante eigenschap State. U kunt de systeemdrivers filteren door alleen de draaiende te selecteren door 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 drivers te selecteren die zijn ingesteld om automatisch te starten door ook de StartMode waarde te testen:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq "Running"} | Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media DriverName : AsyncMacState : RunningStatus : OKStarted : TrueDisplayName : Audio Stub DriverName : audstubState : RunningStatus : OKStarted : True...
Dit geeft ons een hoop informatie die we niet meer nodig hebben omdat we weten dat de drivers draaien. In feite zijn de enige informatie die we waarschijnlijk nodig hebben op dit moment de naam en de schermnaam. Het volgende commando bevat alleen die twee eigenschappen, wat resulteert in een veel eenvoudiger 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 Driverbindflt Windows Bind Filter Driverbowser BrowserCompositeBus Composite Bus Enumerator Drivercondrv Console DriverHdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio ServiceHDAudBus Microsoft UAA Bus Driver for High Definition AudioHidUsb Microsoft HID Class DriverHTTP HTTP Serviceigfx igfxIntcDAud Intel(R) Display Audiointelppm Intel Processor Driver...
Er zijn twee Where-Object
elementen in het bovenstaande commando, maar ze kunnen worden uitgedrukt in een enkelWhere-Object
element door gebruik te maken van de -and
logische operator, zoals dit:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName
De standaard logische operatoren zijn opgesomd in de volgende tabel.
Logische operator | Betekenis | Voorbeeld (geeft waar weer) |
---|---|---|
-en | Logische en; waar als beide zijden waar zijn | (1 -eq 1) -en (2 -eq 2) |
-of | Logische of; waar als een van beide zijden waar is | (1 -eq 1) -of (1 -eq 2) |
-niet | Logisch niet; keert waar en onwaar om | -niet (1 -eq 2) |
! | Logisch niet; keert om waar en onwaar | !(1 -eq 2) |