- 12/23/2019
- 4 minuter att läsa
-
- j
- s
- m
In PowerShell, genererar och skickar du ofta fler objekt till en pipeline än du vill ha. Du kan ange egenskaperna för vissa objekt som ska visas med hjälp av Format-*
cmdlets, men detta hjälper inte mot problemet med att ta bort hela objekt från visningen. Du kanske vill filtrera objekt före slutet av en pipeline, så att du kan utföra åtgärder på endast en delmängd av de ursprungligen genererade objekten.
PowerShell innehåller en Where-Object
cmdlet som gör det möjligt att testa varje objekt i pipelinen och endast skicka det vidare i pipelinen om det uppfyller ett visst testvillkor. Objekt som inte klarar testet tas bort från pipelinen. Du anger testvillkoret som värdet på parameternFilterScript.
Uppförande av enkla tester med Where-Object
Värdet på FilterScript är ett skriptblock – ett eller flera PowerShell-kommandon omgivet av hakparenteser ({}
) – som utvärderas till sant eller falskt. Dessa skriptblock kan vara mycket enkla, men för att skapa dem krävs kunskap om ett annat PowerShell-koncept, nämligen jämförelseoperatörer. En jämförelseoperator jämför de objekt som visas på vardera sidan av den. Jämförelseoperatorer börjar med ett bindestreck (-
) och följs av ett namn. Grundläggande jämförelseoperatörer fungerar på nästan alla typer av objekt. De mer avancerade jämförelseoperatörerna fungerar kanske bara på text eller matriser.
Note
Som standard är PowerShell-jämförelseoperatörer som arbetar med text skiftlägeskänsliga.
På grund av parsingöverväganden används inte symboler som <
,>
och =
som jämförelseoperatörer. Istället består jämförelseoperatorer av bokstäver. De grundläggande jämförelseoperatorerna anges i följande tabell.
Förhållandeoperator | Beteydelse | Exempel (returnerar sant) |
---|---|---|
-eq | är lika med | 1 -.eq 1 |
-ne | är inte lika med | 1 -ne 2 |
-lt | är mindre än | 1 -lt 2 |
-le | är mindre än eller lika med | 1 -le 2 |
-gt | är större än | 2 -gt 1 |
-ge | Är större än eller lika med | 2 -ge 1 |
-like | ”file.doc” -like ”f*.do?” | |
-notlike | Inte som (jokerordsjämförelse för text) | ”file.doc” -notlike ”p*.doc” |
-contains | Innehåller | 1,2,3 -innehåller 1 |
-notcontains | Innehåller inte | 1,2,3 -Innehåller inte 4 |
Where-Object
skriptblock använder den speciella variabeln $_
för att hänvisa till det aktuella objektet ipipelinen. Här är ett exempel på hur det fungerar. Om du har en lista med siffror och bara vill returnera de som är mindre än 3 kan du använda Where-Object
för att filtrera siffrorna genom att skriva:
1,2,3,4 | Where-Object {$_ -lt 3}12
Filtrering baserat på objektegenskaper
Då $_
hänvisar till det aktuella pipeline-objektet kan vi få tillgång till dess egenskaper för våra tester.
Som exempel kan vi titta på klassen Win32_SystemDriver i WMI. Det kan finnas hundratals systemdrivrutiner på ett visst system, men du kanske bara är intresserad av en viss uppsättning systemdrivrutiner, t.ex. de som körs för närvarande. För klassen Win32_SystemDriver är den relevanta egenskapen State. Du kan filtrera systemdrivrutinerna och bara välja de som körs genom att skriva:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
Detta ger fortfarande en lång lista. Du kanske vill filtrera så att du bara väljer de drivrutiner som är inställda på att starta automatiskt genom att testa värdet StartMode också:
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...
Detta ger oss en massa information som vi inte längre behöver eftersom vi vet att drivrutinerna körs.Faktum är att den enda information som vi troligen behöver vid det här laget är namnet och visningsnamnet. Följande kommando innehåller endast dessa två egenskaper, vilket ger mycket enklare utdata:
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...
Det finns två Where-Object
-element i ovanstående kommando, men de kan uttryckas i ett enda Where-Object
-element med hjälp av den logiska operatorn -and
, så här:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName
Standardiserade logiska operatörer finns i följande tabell.
Logisk operatör | Betydelse | Exempel (returnerar sant) |
---|---|---|
och | Logiskt och; sant om båda sidorna är sanna | |
Logiskt eller; sant om endera sidan är sann | ||
Logiskt inte; vänder på sant och falskt | ||
! | Logiskt inte; vänder på sant och falskt | !(1 -eq 2) |