- 12/23/2019
- 4 minuty na przeczytanie
-
- j
- s
- m
W PowerShell, często generujesz i przekazujesz do potoku więcej obiektów niż chcesz. Można określić właściwości poszczególnych obiektów do wyświetlenia za pomocą cmdletów Format-*
, ale nie pomaga to w rozwiązaniu problemu usuwania całych obiektów z wyświetlania. Możesz chcieć filtrować obiekty przed końcem potoku, aby móc wykonywać akcje tylko na podzbiorze początkowo wygenerowanych obiektów.
PowerShell zawiera cmdlet Where-Object
, który umożliwia testowanie każdego obiektu w potoku i przekazywanie go dalej tylko wtedy, gdy spełnia określony warunek testu. Obiekty, które nie przejdą testu są usuwane z rurociągu. Warunek testu jest podawany jako wartość parametruFilterScript.
Performing Simple Tests with Where-Object
Wartość parametruFilterScript jest blokiem skryptu – jednym lub kilkoma poleceniami PowerShell otoczonymi nawiasami ({}
) – który zwraca wartość true lub false. Te bloki skryptów mogą być bardzo proste, ale ich tworzenie wymaga znajomości innej koncepcji PowerShella, operatorów porównania. Operator porównania porównuje elementy, które występują po obu jego stronach. Operatory porównania zaczynają się od myślnika (-
), po którym następuje nazwa. Podstawowe operatory porównania działają na prawie każdym obiekcie. Bardziej zaawansowane operatory porównania mogą działać tylko na tekście lub tablicach.
Uwaga
Domyślnie, podczas pracy z tekstem, operatory porównania PowerShell nie uwzględniają wielkości liter.
Z uwagi na parsowanie, 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) |
---|---|---|
jest równe | ||
-ne | nie jest równa | 1 -ne 2 |
1 -lt 2 | ||
-le | Jest mniejsza lub równa | 1 -le 2 |
-gt | 2 -gt 1 | |
-ge | Is greater than or equal to | 2 -ge 1 |
-like | „file.doc” -like „f*.do?” | |
-notlike | Is not like (wildcard comparison for text) | „file.doc” -notlike „p*.doc” |
-contains | Contains | 1,2,3 -contains 1 |
-notcontains |
Where-Object
bloki skryptu używają zmiennej specjalnej $_
do odwołania się do bieżącego obiektu w linii. Oto przykład, jak to działa. 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}12
Filtering Based on Object Properties
Ponieważ $_
odnosi się do bieżącego obiektu rurociągu, możemy uzyskać dostęp do jego właściwości dla naszych testów.
Jako przykład, możemy spojrzeć na klasę Win32_SystemDriver w WMI. Na danym systemie mogą być setki sterowników systemowych, ale Ciebie może interesować tylko konkretny zestaw sterowników systemowych, np. te, które są aktualnie uruchomione. Dla klasy Win32_SystemDriver odpowiednią właściwością jest State. Możesz filtrować sterowniki systemowe, wybierając tylko te działające, wpisując:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
To wciąż daje długą listę. Możesz filtrować, aby wybrać tylko sterowniki ustawione na automatyczne uruchamianie poprzez testowanie wartości StartMode, jak również:
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...
To daje nam wiele informacji, których już nie potrzebujemy, ponieważ wiemy, że sterowniki są uruchomione.W rzeczywistości, jedyne informacje, których prawdopodobnie potrzebujemy w tym momencie to nazwa i nazwa wyświetlana. Poniższe polecenie zawiera tylko te dwie właściwości, dając znacznie prostszy wynik:
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...
W powyższym poleceniu występują dwa elementy Where-Object
, ale można je wyrazić w pojedynczym elemencieWhere-Object
za pomocą operatora logicznego -and
, jak poniżej:
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) |
---|---|---|
Logiczne i; true if both sides are true | ||
-or | Logical or; true jeśli któraś ze stron jest prawdziwa | (1 -eq 1) -or (1 -eq 2) |
-not | Logical not; odwraca true i false | -not (1 -eq 2) |
! | Logical not; reverses true and false | !(1 -eq 2) |
.