Come utilizzare il comando Where-Object in PowerShell
-
il cmdlet
Where-Object
in PowerShell - Creare condizioni di filtro con i blocchi di script in PowerShell
-
Utilizzare
Where-Object
per filtrare oggetti in PowerShell - Creare condizioni di filtro con parametri in PowerShell
- Utilizzo di più affermazioni condizionali

Quando lavori con le proprietà di Windows PowerShell in una collezione di oggetti, a volte avrai bisogno di un modo per filtrare tutte le cose specifiche di cui hai solo bisogno. Pertanto, sapere come utilizzare il cmdlet Where-Object
di Windows PowerShell è una tecnica fondamentale da avere nel tuo set di abilità di Windows PowerShell.
Il cmdlet Where-Object
è un comando prezioso per filtrare oggetti. In questo articolo impareremo diversi modi per costruire un comando Where-Object
, la sua sintassi e l’uso di più affermazioni condizionali.
il cmdlet Where-Object
in PowerShell
L’unico scopo del cmdlet Where-Object
di Windows PowerShell è filtrare l’output di un comando e restituire informazioni specifiche che vogliamo stampare.
In sintesi, il cmdlet Where-Object
è un filtro. Ci permette di costruire una condizione che restituisce True
o False
. A seconda del risultato della situazione, il cmdlet restituisce quindi l’output oppure no.
Puoi creare quella condizione in due modi: blocchi di script e parametri.
Creare condizioni di filtro con i blocchi di script in PowerShell
I blocchi di script sono un componente vitale in Windows PowerShell. Vengono utilizzati in centinaia di luoghi all’interno del linguaggio di scripting. Un blocco di script è una funzione anonima che categorizza codice ed esegue in vari luoghi.
Esempio di blocco di script:
{$_.StartType -EQ 'Automatic'}
Utilizzando la pipeline di Windows PowerShell, puoi quindi inviare quegli oggetti al cmdlet Where-Object
e usare il parametro FilterScript
. Poiché il parametro FilterScript
accetta un blocco di script, possiamo creare una condizione per verificare se la proprietà di ciascun oggetto è uguale a un valore specifico, come nell’esempio qui sotto.
Codice di esempio:
Get-Service | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
Where-Object
e non includono il nome del parametro FilterScript
. Invece, forniscono il blocco di script da solo come Where-Object {$_.StartType -eq 'Automatic'}
per un modo più veloce e pulito di scrivere script.Sebbene questo tipo di sintassi funzioni per questo particolare scenario, il concetto di un blocco di script con le parentesi graffe ({}
) rende il codice meno leggibile e più difficile per gli utenti di Windows PowerShell meno esperti. Questo problema di leggibilità ha portato il team di Windows PowerShell a introdurre parametri.
Utilizzare Where-Object
per filtrare oggetti in PowerShell
Il Get-ChildItem
ottiene l’elenco di tutti i file e le cartelle nella posizione specificata. Supponiamo di voler visualizzare solo i file .csv
nella directory.
Il seguente esempio mostra come utilizzare il cmdlet Where-Object
per filtrare e selezionare solo i file .csv
.
Get-ChildItem | Where-Object { $_.extension -eq ".csv" }
Nel codice sopra, l’output di Get-ChildItem
viene inviato al cmdlet Where-Object
. Il Where-Object
filtra l’output dove l’estensione del file è .csv
.
Output:
Directory: C:\Users\rhntm
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/11/2022 7:57 AM 122 books.csv
-a---- 3/8/2022 2:07 PM 780199 house_data.csv
-a---- 3/8/2022 10:38 PM 421 play_tennis.csv
Puoi anche usare Where
come alias per il cmdlet Where-Object
.
Di seguito è riportato un altro esempio che filtra l’elenco dei processi con il valore della proprietà ProcessName
. Mostra solo i processi che hanno spotify
come ProcessName
.
Get-Process | where { $_.ProcessName -in "spotify" }
Output:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
550 31 55036 71256 2.81 1820 3 Spotify
294 21 12328 18144 0.06 13536 3 Spotify
476 64 96012 141208 20.61 13980 3 Spotify
Puoi utilizzare l’operatore -notin
per selezionare valori che non sono nella collezione di oggetti.
Ad esempio, il seguente esempio stampa tutti i processi che non hanno spotify
come ProcessName
.
Get-Process | where { $_.ProcessName -notin "spotify" }
In questo modo, puoi utilizzare il cmdlet Where-Object
per filtrare gli oggetti dalla collezione di oggetti in base ai loro valori di proprietà.
Creare condizioni di filtro con parametri in PowerShell
Introdotti in Windows PowerShell 3.0, i parametri hanno un flusso più naturale rispetto a come sono scritti. Utilizzando lo stesso esempio precedente, utilizziamo i parametri per filtrare un output specifico.
Codice di esempio:
Get-Service | Where-Object -Property StartType -EQ 'Automatic'
Nota sopra che invece di utilizzare un blocco di script, il comando specifica la proprietà dell’oggetto come valore del parametro Property. Inoltre, l’operatore -eq
è ora un parametro, permettendoti di passare il valore Automatic
.
Utilizzando i parametri in questo modo, ora si elimina la necessità di un blocco di script. Tuttavia, sebbene Microsoft abbia introdotto i parametri come un modo più pulito di scrivere script, abbiamo un’ottima ragione per utilizzare i blocchi di script di cui discuteremo nella prossima sezione dell’articolo.
Utilizzo di più affermazioni condizionali
Puoi combinare due o più condizioni utilizzando un operatore (come -and
o -or
) per valutarle utilizzando un blocco di script. Tuttavia, dobbiamo utilizzare un componente particolare di Windows PowerShell chiamato subespressioni per valutare ciascuna condizione con successo.
In Windows PowerShell, possiamo utilizzare subespressioni per eseguire un’espressione all’interno di una sintassi di filtro come Where-Object
. Lo facciamo racchiudendo qualunque affermazione condizionale eseguiamo tra parentesi (()
).
Codice di esempio:
Get-Process | Where-Object { ($_.CPU -gt 2.0) -and ($_.CPU -lt 10) }
Esempio di blocco di script:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------ - ------ ---- - ---- - ------ -- -- ---------- -
334 21 18972 26384 5.23 3808 0 AnyDesk
635 34 13304 51264 9.56 4140 5 notepad
726 36 12820 51196 4.69 12088 5 notepad
802 46 18356 65088 7.98 10784 5 OneDrive
340 18 6472 26436 3.44 1252 5 RuntimeBroker
698 34 14672 44484 3.63 3284 5 RuntimeBroker
323 19 5732 23432 4.00 11200 5 RuntimeBroker
560 18 6440 27752 4.63 8644 5 sihost
632 31 21524 69972 2.81 6392 5 StartMenuExperienceHost
390 18 9756 30832 3.94 3084 5 svchost
523 24 8768 36312 2.17 6300 5 svchost
524 17 6416 21036 4.42 10932 5 SynTPEnh
525 22 15336 38904 3.41 2192 5 TextInputHost
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn