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