Ta bort objekt från pipelinen (Where-Object)

I PowerShell genererar och skickar du ofta fler objekt till en pipeline än du vill. Du kan ange egenskaperna för specifika objekt som ska visas med hjälp av cmdletarna, men det hjälper inte med problemet med att ta bort hela Format-* objekt från skärmen. Du kanske vill filtrera objekt före slutet av en pipeline, så att du bara kan utföra åtgärder på en delmängd av de ursprungligen genererade objekten.

PowerShell innehåller en cmdlet som gör att du kan testa varje objekt i pipelinen och bara skicka det längs pipelinen om Where-Object det uppfyller ett visst testvillkor. Objekt som inte klarar testet tas bort från pipelinen. Du anger testvillkoret som värde för parametern FilterScript.

Utföra enkla tester med Where-Object

Värdet för FilterScript är ett skriptblock – ett eller flera PowerShell-kommandon som omges av kparenteser ( ) – som {} utvärderas till sant eller falskt. Dessa skriptblock kan vara väldigt enkla, men för att kunna skapa dem måste du känna till ett annat PowerShell-begrepp, jämförelseoperatorer. En jämförelseoperator jämför de objekt som visas på varje sida av den. Jämförelseoperatorer börjar med ett bindestreck ( - ) och följs av ett namn. Grundläggande jämförelseoperatorer fungerar på nästan alla typer av objekt. De mer avancerade jämförelseoperatorer kanske bara fungerar med text eller matriser.

Anteckning

När du arbetar med text är PowerShell-jämförelseoperatorer som standard icke-känsliga.

På grund av parsningsöverväganden används symboler < som , och inte som > = jämförelseoperatorer. Jämförelseoperatorer består i stället av bokstäver. De grundläggande jämförelseoperatorer visas i följande tabell.

Jämförelseoperator Innebörd Exempel (returnerar true)
-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 Är som (jokerteckenjämförelse för text) "file.doc" -like "f*.do?"
-notlike Är inte som (jokerteckenjämförelse för text) "file.doc" –notlike "p*.doc"
-contains Innehåller 1,2,3 -contains 1
-notcontains Innehåller inte 1,2,3 -notcontains 4

Where-Object skriptblock använder den särskilda $_ variabeln för att referera till det aktuella objektet i pipelinen. Här är ett exempel på hur det fungerar. Om du har en lista med tal och bara vill returnera dem som är mindre än 3 kan du använda för att Where-Object filtrera talen genom att skriva:

1,2,3,4 | Where-Object {$_ -lt 3}
1
2

Filtrering baserat på objektegenskaper

Eftersom $_ refererar till det aktuella pipelineobjektet kan vi komma åt dess egenskaper för våra tester.

Vi kan till exempel titta på Win32_SystemDriver i WMI. Det kan finnas hundratals systemdrivrutiner i ett visst system, men du kanske bara är intresserad av en viss uppsättning systemdrivrutiner, till exempel de som körs för närvarande. För 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 skapar fortfarande en lång lista. Du kanske bara vill filtrera för att välja de drivrutiner som angetts för att starta automatiskt genom att testa StartMode-värdet också:

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

Det ger oss mycket information som vi inte längre behöver eftersom vi vet att drivrutinerna körs. I själva verket är den enda information som vi förmodligen behöver i det här läget namnet och visningsnamnet. Följande kommando innehåller bara dessa två egenskaper, vilket resulterar i 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 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
...

Det finns två element i kommandot ovan, men de kan uttryckas i ett enda element med Where-Object hjälp av den logiska Where-Object -and operatorn, så här:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} |
    Format-Table -Property Name,DisplayName

De logiska standardoperatorer visas i följande tabell.

Logisk operator Innebörd Exempel (returnerar true)
-and Logiskt och; sant om båda sidorna är sanna (1 -eq 1) -and (2 -eq 2)
-eller Logiskt eller; true om endera sidan är sann (1 -eq 1) -eller (1 -eq 2)
-not Logiskt inte; reverses true and false -not (1 -eq 2)
! Logiskt inte; reverses true and false !(1 -eq 2)