- 23.12.2019
- 4 minuty čtení
-
- j
- s
- m
V prostředí PowerShell, často generujete a předáváte do pipeline více objektů, než chcete. Pomocí rutin Format-*
můžete specifikovat vlastnosti jednotlivých objektů, které se mají zobrazit, ale to nepomůže s problémem odstranění celých objektů ze zobrazení. Možná budete chtít filtrovatobjekty před koncem pipeline, abyste mohli provádět akce pouze na podmnožině původně vygenerovaných objektů.
PowerShell obsahuje Where-Object
cmdlet, který umožňuje testovat každý objekt v pipeline a předat jej podél pipeline pouze tehdy, pokud splňuje určitou testovací podmínku. Objekty, které nevyhoví testu, jsou z potrubí odstraněny. Podmínku testu zadáte jako hodnotu parametruFilterScript.
Provádění jednoduchých testů pomocí Where-Object
Hodnotou parametru FilterScript je blok skriptu – jeden nebo více příkazů prostředí PowerShell obklopených závorkami ({}
) – který se vyhodnotí jako true nebo false. Tyto skriptové bloky mohou být velmi jednoduché, alejejich vytvoření vyžaduje znalost dalšího konceptu prostředí PowerShell, operátorů porovnávání. Operátor porovnání porovnává položky, které se nacházejí na obou jeho stranách. Operátory porovnávání začínají znakem pomlčky (-
) a následuje za nimi název. Základní operátory porovnávání fungují téměř na všech druzíchobjektů. Pokročilejší operátory porovnávání mohou pracovat pouze s textem nebo poli.
Poznámka
Ve výchozím nastavení při práci s textem operátory porovnávání prostředí PowerShell nerozlišují velká a malá písmena.
Z důvodů analýzy se symboly jako <
,>
a =
jako operátory porovnávání nepoužívají. Místo toho se porovnávací operátory skládají z písmen. Základní operátory porovnáváníjsou uvedeny v následující tabulce.
Operátor porovnání | Význam | Příklad (vrací true) |
---|---|---|
-eq | se rovná | 1 -.eq 1 |
-ne | není rovno | 1 -ne 2 |
-lt | je menší než | 1 -lt 2 |
-le | Je menší nebo rovno | 1 -le 2 |
-gt | Je větší než | 2 -.gt 1 |
-ge | Je větší nebo rovno | 2 -ge 1 |
-jako | Je jako (zástupný znak pro porovnání textu) | „file.doc“ -podobný „f*.do?“ |
-nepodobný | Není podobný (porovnání zástupných znaků pro text) | „file.doc“ -nepodobný „p*.doc“ |
-obsahuje | Obsahuje | 1,2,3 -obsahuje 1 |
-neobsahuje | Není obsaženo | 1,2,3 -neobsahuje 4 |
Where-Object
bloky skriptu používají speciální proměnnou $_
pro odkaz na aktuální objekt vpipeline. Zde je příklad, jak to funguje. Pokud máte seznam čísel a chcete vrátit pouze ta, která jsou menší než 3, můžete pomocí Where-Object
filtrovat čísla zadáním:
1,2,3,4 | Where-Object {$_ -lt 3}12
Filtrování podle vlastností objektu
Protože $_
odkazuje na aktuální objekt pipeline, můžeme pro naše testy přistupovat k jeho vlastnostem.
Jako příklad se můžeme podívat na třídu Win32_SystemDriver ve WMI. V určitém systému mohou existovat stovky systémových ovladačů, ale vás může zajímat pouze určitá sada systémových ovladačů, například ty, které jsou právě spuštěny. Pro třídu Win32_SystemDriver je důležitá vlastnost State. Systémové ovladače můžete filtrovat a vybrat pouze ty, které jsou spuštěny, zadáním:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
Tím se však stále vytvoří dlouhý seznam. Možná budete chtít filtrovat tak, abyste vybrali pouze ovladače nastavené na automatické spuštění, a to 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 DriverName : AsyncMacState : RunningStatus : OKStarted : TrueDisplayName : Audio Stub DriverName : audstubState : RunningStatus : OKStarted : True...
Tím získáme spoustu informací, které již nepotřebujeme, protože víme, že ovladače jsou spuštěné. ve skutečnosti jediné informace, které v tuto chvíli pravděpodobně potřebujeme, jsou název a zobrazované jméno. 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 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...
Ve výše uvedeném příkazu jsou dva prvky Where-Object
, ale lze je vyjádřit v jediném prvkuWhere-Object
pomocí logického operátoru -and
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 (vrací true) |
---|---|---|
-a | Logické a; true, pokud jsou obě strany pravdivé | (1 -eq 1) -a (2 -eq 2) |
-nebo | Logické nebo; true, pokud je některá ze stran true | (1 -eq 1) -nebo (1 -eq 2) |
-not | Logical not; obrací true a false | -not (1 -eq 2) |
! | Logické ne; obrací true a false | !(1 -eq 2) |