Odebrání objektů z kanálu

V PowerShellu často generujete a předáváte více objektů do kanálu, než potřebujete. Pomocí rutin můžete zadat vlastnosti konkrétních objektů, které se mají zobrazit Format-* , ale to nepomůže s problémem odebrání celých objektů ze zobrazení. Můžete chtít filtrovat objekty před koncem kanálu, takže můžete provádět akce pouze s podmnožinou původně generovaných objektů.

PowerShell obsahuje rutinu Where-Object , která umožňuje otestovat každý objekt v kanálu a předat ho pouze v případě, že splňuje konkrétní testovací podmínku. Objekty, které neprojdou testem, se z kanálu odeberou. Podmínku testu zadáte jako hodnotu parametru FilterScript .

Provádění jednoduchých testů pomocí where-object

Hodnota FilterScriptu je blok skriptu – jeden nebo více příkazů PowerShellu obklopených složenými závorkami ({}), které se vyhodnotí jako true nebo false. Tyto bloky skriptů můžou být jednoduché, ale jejich vytvoření vyžaduje znalost jiného konceptu PowerShellu, operátorů porovnání. Operátor porovnání porovnává položky, které se zobrazují na každé straně. Operátory porovnání začínají znakem spojovníku (-) a za ním následuje název. Základní relační operátory pracují na téměř libovolném typu objektu. Pokročilejší relační operátory můžou pracovat pouze s textem nebo poli.

Poznámka:

Ve výchozím nastavení nerozlišují relační operátory PowerShellu malá a velká písmena.

Vzhledem k aspektům analýzy se symboly, jako <je ,>, nepoužívají = jako relační operátory. Operátory porovnání se místo toho skládají z písmen. Základní relační operátory jsou uvedeny v následující tabulce.

Relační operátor Význam Příklad (vrátí hodnotu true)
-Eq je rovno 1 -eq 1
-ne není rovno 1 -ne 2
-Lt Je menší než 1 -lt 2
-Le Je menší než nebo rovno 1 -le 2
-Gt Je větší než 2 -gt 1
-Ge Je větší nebo rovno 2 -ge 1
-Jako Je to podobné (porovnání zástupných znaků pro text) "file.doc" -like "f*.do?"
-notlike nelíbí se (porovnání zástupných znaků pro text) "file.doc" -notlike "p*.doc"
-Obsahuje Contains 1,2,3 -obsahuje 1
-notcontains neobsahuje 1,2,3 -notcontains 4

Where-Object Bloky skriptu používají speciální proměnnou $_ k odkazování na aktuální objekt v kanálu. Tady je příklad toho, jak funguje. Pokud máte seznam čísel a chcete vrátit jenom čísla, která jsou menší než 3, můžete čísla Where-Object filtrovat zadáním:

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

Filtrování na základě vlastností objektu

Vzhledem k tomu $_ , že odkazuje na aktuální objekt kanálu, můžeme přistupovat k jeho vlastnostem pro naše testy.

Můžeme se například podívat na třídu Win32_SystemDriver ve službě WMI. V určitém systému můžou být stovky systémových ovladačů, ale možná vás zajímá jenom konkrétní sada systémových ovladačů, například těch, které jsou spuštěné. Pro třídu Win32_SystemDriver je relevantní vlastnost State. Systémové ovladače můžete filtrovat tak, že zadáte jenom ty spuštěné:

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

Tím se stále vytváří dlouhý seznam. Možná budete chtít filtrovat, aby se automaticky spustily jenom ovladače nastavené tak, že otestujete také hodnotu 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
...

To nám dává spoustu informací, které už nepotřebujeme, protože víme, že ovladače běží. Ve skutečnosti jsou v tomto okamžiku jedinými informacemi, které pravděpodobně potřebujeme, jméno a zobrazovaný název. Následující příkaz obsahuje pouze tyto dvě vlastnosti, což vede k mnohem jednoduššímu výstupu:

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

Ve výše uvedeném příkazu jsou dva Where-Object prvky, ale dají se vyjádřit v jednom Where-Object prvku pomocí logického operátoru -and , například takto:

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

Standardní logické operátory jsou uvedeny v následující tabulce.

Logický operátor Význam Příklad (vrátí hodnotu true)
-and Logické a; True, pokud jsou obě strany pravdivé (1 -eq 1) -and (2 -eq 2)
-or Logické nebo; True, pokud je na obou stranách pravda (1 -eq 1) -or (1 -eq 2)
-not Logické ne; vrátí hodnotu true a false. -not (1 -eq 2)
! Logické ne; vrátí hodnotu true a false. !(1 -eq 2)