- 12/23/2019
- 4 minutter at læse
-
- j
- s
- m
I PowerShell, genererer og videresender man ofte flere objekter til en pipeline, end man ønsker. Du kan angive egenskaberne for bestemte objekter, der skal vises, ved hjælp af Format-*
cmdlets, men det hjælper ikke på problemet med at fjerne hele objekter fra visningen. Du vil måske filtrereobjekter før slutningen af en pipeline, så du kun kan udføre handlinger på en delmængde af de oprindeligt genererede objekter.
PowerShell indeholder en Where-Object
cmdlet, der giver dig mulighed for at teste hvert objekt i pipelinen og kun sende det videre i pipelinen, hvis det opfylder en bestemt testbetingelse. Objekter, der ikke opfylder testen, fjernes fra pipelinen. Du angiver testbetingelsen som værdien af parameterenFilterScript.
Udførelse af enkle test med Where-Object
Værdien af FilterScript er en scriptblok – en eller flere PowerShell-kommandoer omgivet af parenteser ({}
) – der evalueres til sandt eller falsk. Disse scriptblokke kan være meget enkle, men for at oprette dem skal man have kendskab til et andet PowerShell-koncept, nemlig sammenligningsoperatorer. En sammenligningsoperator sammenligner de elementer, der vises på hver side af den. Sammenligningsoperatorer begynder med et bindestregstegn (-
) og efterfølges af et navn. Grundlæggende sammenligningsoperatører fungerer på næsten alle slagsobjekter. De mere avancerede sammenligningsoperatorer fungerer muligvis kun på tekst eller arrays.
Bemærk
Som standard, når der arbejdes med tekst, er PowerShell-sammenligningsoperatorer ikke skelnes mellem store og små bogstaver.
På grund af parsingovervejelser bruges symboler som <
,>
og =
ikke som sammenligningsoperatører. I stedet består sammenligningsoperatorer af bogstaver. De grundlæggende sammenligningsoperatorer er anført i følgende tabel.
Sammenligningsoperator | Betydning | Eksempel (returnerer sandt) |
---|---|---|
-eq | er lig med | 1 -eq 1 |
-ne | er ikke lig med | 1 -ne 2 |
-lt | er mindre end | 1 -lt 2 |
-le | Er mindre end eller lig med | 1 -le 2 |
-gt | Er større end | |
-ge | Er større end eller lig med | 2 -ge 1 |
-like | “fil.doc” -lig “f*.do?” | |
-ikke-lig | Er ikke som (jokertegnssammenligning for tekst) | “file.doc” -ikke som “p*.doc” |
-contains | Indholder | 1,2,3 -indholder 1 |
-notcontains | Indeholder ikke | 1,2,3 -notcontains 4 |
Where-Object
scriptblokke bruger den særlige variabel $_
til at henvise til det aktuelle objekt ipipelinjen. Her er et eksempel på, hvordan det fungerer. Hvis du har en liste med tal, og du kun vil returnere dem, der er mindre end 3, kan du bruge Where-Object
til at filtrere tallene ved at skrive:
1,2,3,4 | Where-Object {$_ -lt 3}12
Filtrering baseret på objektets egenskaber
Da $_
henviser til det aktuelle pipelineobjekt, kan vi få adgang til dets egenskaber til vores test.
Som eksempel kan vi se på Win32_SystemDriver-klassen i WMI. Der kan være hundredvis afsystemdrivere på et bestemt system, men du er måske kun interesseret i et bestemt sæt af systemdrivere, f.eks. dem, der kører i øjeblikket. For Win32_SystemDriver-klassen er den relevante egenskab State. Du kan filtrere systemdriverne og kun vælge de kørende drivere ved at skrive:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
Det giver stadig en lang liste. Du kan filtrere, så du kun vælger de drivere, der er indstillet til at starte automatisk, ved også at teste værdien StartMode:
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...
Dette giver os en masse oplysninger, som vi ikke længere har brug for, fordi vi ved, at driverne kører.Faktisk er de eneste oplysninger, vi sandsynligvis har brug for på dette tidspunkt, navnet og displaynavnet. Følgende kommando omfatter kun disse to egenskaber, hvilket resulterer i et meget enklere output:
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...
Der er to Where-Object
-elementer i ovenstående kommando, men de kan udtrykkes i et enkeltWhere-Object
-element ved at bruge den logiske operator -and
, som her:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName
De logiske standardoperatører er angivet i følgende tabel.
Logisk operatør | Betydning | Eksempel (returnerer sandt) |
---|---|---|
Logisk eller; sand, hvis en af siderne er sand | ||
Logisk ikke; vender sandt og falsk om | -ikke (1 -eq 2) | |
Logisk ikke; vender sandt og falsk om | !(1 -eq 2) |