- 12/23/2019
- 4 minutes to read
-
- j
- s
- m
In PowerShell, usein luodaan ja välitetään putkistoon enemmän objekteja kuin halutaan. Voitmääritellä tiettyjen objektien ominaisuuksia näytettäväksi Format-*
-komentokomennoilla, mutta tämäei auta ongelmaan, jossa kokonaisia objekteja poistetaan näytöstä. Voit ehkä haluta suodattaaobjekteja ennen putken loppua, jotta voit suorittaa toimia vain alun perin luotujen objektien osajoukolle.
PowerShell sisältää Where-Object
-cmdletin, jonka avulla voit testata jokaisen putkessa olevan objektin ja välittää sen eteenpäin putkessa vain, jos se täyttää tietyn testiehdon. Kohteet, jotka eivät läpäise testiä, poistetaan putkistosta. Testiehto annetaan FilterScript-parametrin arvona.
Yksinkertaisten testien suorittaminen Where-Objectin avulla
FilterScript-parametrin arvo on komentosarjalohko – yksi tai useampi PowerShell-komento, joka on ympäröity sulkujen ({}
) avulla – ja joka arvioi arvoksi true tai false. Nämä komentosarjalohkot voivat olla hyvin yksinkertaisia, mutta niiden luominen edellyttää toisen PowerShell-käsitteen, vertailuoperaattoreiden, tuntemusta. Vertailuoperaattori vertaa sen kummallakin puolella olevia kohteita. Vertailuoperaattorit alkavat väliviivamerkillä (-
) ja niitä seuraa nimi. Perusvertailuoperaattorit toimivat lähes kaikenlaisille kohteille. Edistyneemmät vertailuoperaattorit saattavat toimia vain tekstin tai matriisien kanssa.
Huomautus
PowerShellin vertailuoperaattorit eivät oletusarvoisesti erota isoja ja pieniä kirjaimia tekstin kanssa työskenneltäessä.
Parsimisnäkökohtien vuoksi symboleja, kuten <
,>
ja =
, ei käytetä vertailuoperaattoreina. Sen sijaan vertailuoperaattorit koostuvat kirjaimista. Perusvertailuoperaattorit on lueteltu seuraavassa taulukossa.
Vertailuoperaattori | Merkitys | Esimerkki (palauttaa true) |
---|---|---|
-eq | on yhtä suuri kuin | 1 – -eq 1 |
-ne | ei ole yhtä suuri kuin | 1 -ne 2 |
-lt | on pienempi kuin | 1 – -lt 2 |
-le | On pienempi tai yhtä suuri kuin | 1 -le 2 |
-gt | On suurempi kuin | 2 – -gt 1 |
-ge | On suurempi tai yhtä suuri kuin | 2 -ge 1 |
-like | On samanlainen (jokerimerkkivertailu tekstille) | ”file.doc” -like ”f*.do?” |
-notlike | Ei ole samanlainen kuin (jokerimerkkivertailu tekstille) | ”file.doc” -notlike ”p*.doc” |
-contains | Contains | 1,2,3 -contains 1 |
-notcontains | Does not contain | 1,2,3 -notcontains 4 |
Where-Object
Skriptilohkot käyttävät erikoismuuttujaa $_
viitatakseen nykyiseen objektiin putkistossa. Tässä on esimerkki siitä, miten se toimii. Jos sinulla on luettelo numeroita ja haluat palauttaa vain ne, jotka ovat pienempiä kuin 3, voit käyttää Where-Object
:tä numeroiden suodattamiseen kirjoittamalla:
1,2,3,4 | Where-Object {$_ -lt 3}12
Suodattaminen kohteen ominaisuuksien perusteella
Koska $_
viittaa nykyiseen putkisto-objektiin, voimme käyttää sen ominaisuuksia testeissämme.
Esimerkkinä voimme tarkastella WMI:ssä olevaa Win32_SystemDriver-luokkaa. Tietyssä järjestelmässä voi olla satoja järjestelmäajureita, mutta saatat olla kiinnostunut vain tietystä joukosta järjestelmäajureita, esimerkiksi niistä, jotka ovat parhaillaan käynnissä. Win32_SystemDriver-luokan asiaankuuluva ominaisuus on State. Voit suodattaa järjestelmäajurit valitsemalla vain käynnissä olevat kirjoittamalla:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
Tämä tuottaa silti pitkän luettelon. Voit suodattaa valitsemaan vain ne ajurit, jotka on asetettu käynnistymäänautomaattisesti, testaamalla myös StartMode-arvon:
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ällöin saamme paljon tietoa, jota emme enää tarvitse, koska tiedämme, että ajurit ovat käynnissä.Itse asiassa ainoat tiedot, joita todennäköisesti tarvitsemme tässä vaiheessa, ovat nimi ja näyttönimi. Seuraava komento sisältää vain nämä kaksi ominaisuutta, jolloin tuloste on paljon yksinkertaisempi:
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...
Yllä olevassa komennossa on kaksi Where-Object
-elementtiä, mutta ne voidaan ilmaista yhdelläWhere-Object
-elementillä käyttämällä loogista operaattoria -and
näin:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName
Vakiomuotoiset loogiset operaattorit on lueteltu seuraavassa taulukossa.
Looginen operaattori | Merkitys | Esimerkki (palauttaa true) |
---|---|---|
-ja | Looginen ja; true jos molemmat puolet ovat true | (1 -eq 1) -ja (2 -eq 2) |
-or | Logical or; true jos jompikumpi puoli on true | (1 -eq 1) -tai (1 -eq 2) |
-not | Logical not; kääntää true ja false | -not (1 -eq 2) |
! | Looginen ei; kääntää tosi ja epätosi | !(1 -eq 2) |