Usuwanie obiektów z potoku

W programie PowerShell często generujesz i przekazujesz więcej obiektów do potoku, niż chcesz. Można określić właściwości określonych obiektów do wyświetlenia przy użyciu Format-* poleceń cmdlet, ale nie pomaga to w usuwaniu całych obiektów z wyświetlacza. Można filtrować obiekty przed końcem potoku, aby można było wykonywać akcje tylko na podzestawie początkowo wygenerowanych obiektów.

Program PowerShell zawiera Where-Object polecenie cmdlet umożliwiające przetestowanie każdego obiektu w potoku i przekazanie go tylko w potoku, jeśli spełnia określony warunek testu. Obiekty, które nie przechodzą testu, są usuwane z potoku. Warunek testu należy podać jako wartość parametru FilterScript .

Wykonywanie prostych testów za pomocą obiektu Where-Object

Wartość filterScript to blok skryptu — co najmniej jedno polecenie programu PowerShell otoczone nawiasami klamrowymi ({}) — które daje w wyniku wartość true lub false. Te bloki skryptów mogą być proste, ale ich tworzenie wymaga znajomości innej koncepcji programu PowerShell, operatorów porównania. Operator porównania porównuje elementy, które pojawiają się po każdej stronie. Operatory porównania zaczynają się od znaku łącznika (-) i następują po nim nazwy. Podstawowe operatory porównania pracują nad niemal dowolnym rodzajem obiektu. Bardziej zaawansowane operatory porównania mogą pracować tylko nad tekstem lub tablicami.

Uwaga

Domyślnie operatory porównania programu PowerShell są bez uwzględniania wielkości liter.

Ze względu na zagadnienia dotyczące analizowania symbole, takie jak <,> i = nie są używane jako operatory porównania. Zamiast tego operatory porównania składają się z liter. Podstawowe operatory porównania są wymienione w poniższej tabeli.

Operator porównania Znaczenie Przykład (zwraca wartość true)
-Eq jest równe 1 -eq 1
-Ne nie jest równa 1 -ne 2
-Por Jest mniejsze niż 1 -lt 2
-Le Jest mniejsze niż lub równe 1 -le 2
-Gt Jest większe niż 2 -gt 1
-Ge Jest większe niż lub równe 2 -ge 1
-Jak Jest jak (porównanie symboli wieloznacznych dla tekstu) "file.doc" — na przykład "f*.do?"
-notlike nie jest jak (porównanie symboli wieloznacznych dla tekstu) "file.doc" -notlike "p*.doc"
-Zawiera Contains 1,2,3 — zawiera 1
-notcontains nie zawiera 1,2,3 -notcontains 4

Where-Object Bloki skryptów używają specjalnej zmiennej $_ do odwoływania się do bieżącego obiektu w potoku. Oto przykład sposobu jego działania. Jeśli masz listę liczb i chcesz zwrócić tylko te, które są mniejsze niż 3, możesz użyć Where-Object do filtrowania liczb, wpisując:

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

Filtrowanie na podstawie właściwości obiektu

Ponieważ $_ odwołuje się do bieżącego obiektu potoku, możemy uzyskać dostęp do jego właściwości dla naszych testów.

Na przykład możemy przyjrzeć się klasie Win32_SystemDriver w usłudze WMI. W określonym systemie mogą znajdować się setki sterowników systemowych, ale być może interesuje Cię tylko określony zestaw sterowników systemowych, takich jak te, które są uruchomione. Dla klasy Win32_SystemDriver odpowiednia właściwość to State. Sterowniki systemowe można filtrować, wybierając tylko uruchomione, wpisując:

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq 'Running'}

To nadal tworzy długą listę. Możesz filtrować, aby wybrać tylko sterowniki ustawione do automatycznego uruchamiania, testując również wartość StartMode :

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

Daje nam to wiele informacji, których już nie potrzebujemy, ponieważ wiemy, że kierowcy są uruchomione. W rzeczywistości jedynymi informacjami, których prawdopodobnie potrzebujemy w tym momencie, są nazwa i nazwa wyświetlana. Następujące polecenie zawiera tylko te dwie właściwości, co powoduje znacznie prostsze dane wyjściowe:

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

W powyższym poleceniu znajdują się dwa Where-Object elementy, ale można je wyrazić w jednym Where-Object elemecie przy użyciu operatora logicznego -and , w następujący sposób:

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

Standardowe operatory logiczne są wymienione w poniższej tabeli.

Operator logiczny Znaczenie Przykład (zwraca wartość true)
-and Logiczne i; true, jeśli obie strony mają wartość true (1 -eq 1) -and (2 -eq 2)
-or Logiczne lub; true, jeśli którakolwiek ze stron ma wartość true (1 -eq 1) -or (1 -eq 2)
-not Nie logiczne; odwraca wartość true i false -not (1 -eq 2)
! Nie logiczne; odwraca wartość true i false !(1 -eq 2)