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

-eq

1 -.eq 1

-lt jest mniejsza niż

Jest większa niż

Is like (wildcard comparison for text)

Does not contain 1,2,3 -notcontains 4

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.

i

(1 -eq 1) -and (2 -eq 2)

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)

.

admin

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

lg