Dela via


Ta bort objekt från pipelinen

I PowerShell genererar och skickar du ofta fler objekt till en pipeline än du vill. Du kan ange egenskaperna för vissa objekt som ska visas med hjälp av Format-* cmdletarna, men det hjälper inte med problemet med att ta bort hela 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 Where-Object cmdlet som gör att du kan testa varje objekt i pipelinen och endast skicka det längs pipelinen om det uppfyller ett visst testvillkor. Objekt som inte klarar testet tas bort från pipelinen. Du anger testvillkoret som värdet för FilterScript-parametern .

Utföra enkla tester med Where-Object

Värdet för FilterScript är ett skriptblock – ett eller flera PowerShell-kommandon omgivna av klammerparenteser ({}) – som utvärderas till sant eller falskt. Dessa skriptblock kan vara enkla, men för att skapa dem måste du känna till ett annat PowerShell-koncept, 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örelseoperatorerna kanske bara fungerar med text eller matriser.

Kommentar

Som standard är PowerShell-jämförelseoperatorer skiftlägeskä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örelseoperatorerna visas i följande tabell.

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

Where-Object skriptblock använder specialvariabeln $_ 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 de som är mindre än 3 kan du använda Where-Object för att 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å klassen 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 klassen Win32_SystemDriver är den relevanta egenskapen Tillstånd. 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 för att bara välja de drivrutiner som ska 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
...

Detta ger oss mycket information som vi inte längre behöver eftersom vi vet att förarna körs. Faktum är att den enda information vi förmodligen behöver just nu är namnet och visningsnamnet. Följande kommando innehåller endast 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å Where-Object element i kommandot ovan, men de kan uttryckas i ett enda Where-Object element med hjälp av den -and logiska 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 standardoperatorerna visas i följande tabell.

Logisk operator Innebörd Exempel (returnerar sant)
-and Logiskt och; sant om båda sidor är sanna (1 -eq 1) -and (2 -eq 2)
-or Logiskt eller; sant om båda sidor är sanna (1 -eq 1) -or (1 -eq 2)
-not Logiskt inte; omvänder sant och falskt -not (1 -eq 2)
! Logiskt inte; omvänder sant och falskt !(1 -eq 2)