- 12/23/2019
- 4 minute de citit
-
- j
- s
- m
În PowerShell, deseori generați și transmiteți la o conductă mai multe obiecte decât doriți. Puteți să specificați proprietățile anumitor obiecte care urmează să fie afișate utilizând cmdleturile Format-*
, dar acest lucrunu vă ajută cu problema eliminării unor obiecte întregi din afișare. Este posibil să doriți să filtrați obiectele înainte de sfârșitul unui pipeline, astfel încât să puteți efectua acțiuni numai asupra unui subset de obiecte generate inițial.
PowerShell include un cmdlet Where-Object
care vă permite să testați fiecare obiect din pipeline și să îl treceți de-a lungul pipeline-ului numai dacă îndeplinește o anumită condiție de testare. Obiectele care nu trec testul sunt eliminate din pipeline. Furnizați condiția de testare ca valoare a parametruluiFilterScript.
Realizarea de teste simple cu Where-Object
Valoarea lui FilterScript este un bloc de script – una sau mai multe comenzi PowerShell înconjurate de paranteze ({}
) – care se evaluează la true sau false. Aceste blocuri de script pot fi foarte simple, darcrearea lor necesită cunoașterea unui alt concept PowerShell, operatorii de comparație. Un operator de comparare compară elementele care apar de fiecare parte a acestuia. Operatorii de comparare încep cu o cratimă (-
) și sunt urmați de un nume. Operatorii de comparație de bază funcționează pe aproape orice tip de obiect. Operatorii de comparație mai avansați ar putea funcționa numai pe text sau matrici.
Nota
În mod implicit, atunci când se lucrează cu text, operatorii de comparație PowerShell nu țin cont de majuscule și minuscule.
Din considerente legate de parsare, simboluri precum <
,>
și =
nu sunt utilizate ca operatori de comparație. În schimb, operatorii de comparație sunt compuși din litere. Operatorii de comparație de bază sunt enumerați în tabelul următor.
Operator de comparație | Semnificație | Exemplu (returnează adevărat) |
---|---|---|
-eq | ||
-ne | Nu este egal cu | |
-lt | ||
-nu este asemănător | Nu este asemănător cu (comparație cu wildcard pentru text) | „file.doc” -nu este asemănător cu „p*.doc” |
Where-Object
blocurile de script utilizează variabila specială $_
pentru a se referi la obiectul curent din linie. Iată un exemplu de funcționare. Dacă aveți o listă de numere și doriți să le returnați doar pe cele care sunt mai mici de 3, puteți folosi Where-Object
pentru a filtra numerele tastând:
1,2,3,4 | Where-Object {$_ -lt 3}12
Filtrare pe baza proprietăților obiectului
Din moment ce $_
se referă la obiectul curent al pipeline-ului, putem accesa proprietățile acestuia pentru testele noastre.
Ca exemplu, putem examina clasa Win32_SystemDriver din WMI. S-ar putea să existe sute de driver de sistem pe un anumit sistem, dar s-ar putea să fiți interesat doar de un anumit set de driver de sistem, cum ar fi cele care rulează în prezent. Pentru clasa Win32_SystemDriver, proprietatea relevantă este State. Puteți filtra driverele de sistem, selectându-le numai pe cele care rulează, tastând:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
Aceasta produce totuși o listă lungă. Este posibil să doriți să filtrați pentru a selecta numai driverele setate să pornească automat, testând și valoarea 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...
Acest lucru ne oferă o mulțime de informații de care nu mai avem nevoie, deoarece știm că driverele rulează.De fapt, singurele informații de care avem probabil nevoie în acest moment sunt numele și numele de afișare. Următoarea comandă include doar aceste două proprietăți, rezultând o ieșire mult mai simplă:
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...
Există două elemente Where-Object
în comanda de mai sus, dar ele pot fi exprimate într-un singur elementWhere-Object
prin utilizarea operatorului logic -and
, astfel:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName
Operatorii logici standard sunt enumerați în tabelul următor.
Operator logic | Semnificație | Exemplu (returnează true) |
---|---|---|
și | ||
-not | -not (1 -eq 2) | |
! |