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