Gyakran fordul az elő, hogy nem minden gyűjtemény-elemmel szeretnénk foglalkozni, hanem csak bizonyos tulajdonsággal rendelkezőkkel, és ezeket szeretnénk tovább küldeni a csővezetékünkben feldolgozásra, a szűrőfeltételünknek nem megfelelő elemeket egyszerűen el szeretnénk dobni. Ugyan ezt meg lehet tenni a ForEach-Object és az IF kombinációjával, de van egy direkt erre kitalált cmdletünk is, a Where-Object:
[1] PS C:\> $tömb = 1,2,"szöveg", 3
[2] PS C:\> $tömb | Where-Object {$_ -is [int]} | ForEach-Object {$_*2}
2
4
6
Ugyan a Where-Object nem vezérlő utasítás, a hagyományos programozási értelemben, de mivel a csővezetékek kezelése annyira tipikus a PowerShellben, ezért minden csővezetéket „vezérlő” utasítást is nyugodtan sorolhatunk ebbe a kategóriába.
Ha alaposabban megnézzük a Where-Object súgóját legalább PowerShell 3.0-nál, akkor ezt látjuk:
PS C:\> get-help Where-Object
NAME
Where-Object
SYNOPSIS
Selects objects from a collection based on their property values.
SYNTAX
Where-Object [-Property] <String> [[-Value] <Object>] [-EQ] [-InputObject
<PSObject>] [<CommonParameters>]
Where-Object [-Property] <String> [[-Value] <Object>] [-InputObject <PSObj
ect>] -Contains [<CommonParameters>]
Where-Object [-FilterScript] <ScriptBlock> [-InputObject
<PSObject>] [<Com
monParameters>]
Where-Object [-Property] <String> [[-Value] <Object>] [-InputObject <PSObj
ect>] -GE [<CommonParameters>]
…
A vastagon kiemelt 3. szintaxis az eredeti működést mutatja, viszont itt is találunk a gyakori felhasználást lehetővé tevő egyszerűsített üzemmódokat megvalósító lehetőségeket is. Például a 4. szintaxist felhasználva:
PS C:\> Get-Process | Where-Object -Property Ws -GE 130mb
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
557 68 224668 235556 981 67,60 1412 powershell_ise
1207 79 136624 175092 768 881,59 11120 WINWORD
Vagy pozícionális paraméterezést felhasználva szinte már a hétköznapi beszédhez hasonló kifejezést kapunk:
PS C:\> Get-Process | Where WS -ge 130mb
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
556 68 224628 235532 981 67,64 1412 powershell_ise
1217 79 159616 197680 795 952,37 11120 WINWORD
És ezért kell ilyen sok szintaxis a Where-Object-hez, hogy minden, a tulajdonságokra értelmezhető operátor (-eq, -contains, -ge, -ne, …) használható legyen.