Quando lavori con i valori delle proprietà di PowerShell in una collezione di oggetti, a volte avrai bisogno di un modo per filtrare tutto ciò che non ti serve. Sapere come utilizzare il cmdlet PowerShell Where-Object
è una competenza importante da avere nel tuo toolbox PowerShell.
Il cmdlet Where-Object
è un modo pratico per filtrare gli oggetti. In questo tutorial, imparerai diversi modi per costruire un comando Where-Object
, i suoi parametri disponibili, la sintassi e come utilizzare condizioni multiple come un professionista!
Prerequisiti
C’è solo un prerequisito per questo articolo. Dovresti avere una certa familiarità di base con i comandi e la sintassi di PowerShell.
Tutti gli esempi in questo articolo si baseranno sulla versione stabile attuale di PowerShell (7.1.0 al momento della scrittura). Ma fintanto che hai Windows PowerShell 4.0 o versioni successive, i comandi funzioneranno allo stesso modo.
Comprensione del funzionamento di PowerShell Where-Object
L’unico obiettivo del cmdlet PowerShell Where-Object
è filtrare l’output di un comando per restituire solo le informazioni che si desidera visualizzare.
In poche parole, il cmdlet Where-Object
è un filtro; questo è tutto. Ti permette di costruire una condizione che restituisce True o False. In base al risultato di tale condizione, il cmdlet restituisce o meno l’output.
Puoi formulare quella condizione in uno dei due modi; il “vecchio” modo con scriptblocks e il “nuovo” modo utilizzando parametri o istruzioni di confronto.
Creazione di condizioni di filtro con scriptblocks
Gli scriptblocks sono un componente chiave in PowerShell. Gli scriptblocks vengono utilizzati in centinaia di posizioni in tutto il linguaggio. Uno scriptblock è una funzione anonima. È un modo per compartimentare il codice ed eseguirlo in vari luoghi. Puoi creare un filtro per Where-Object
tramite uno scriptblock.
Per utilizzare uno scriptblock come filtro, dovresti utilizzare il parametro FilterScript
. Questo parametro ti consente di creare e passare uno scriptblock al parametro FilterScript
che verrà quindi eseguito.
Se lo scriptblock restituisce un valore diverso da un booleano Falso o una variabile nulla, viene considerato Vero. In caso contrario, viene considerato Falso.
Ad esempio, supponiamo tu debba trovare tutti i servizi di Windows che attualmente hanno un tipo di avvio di Automatico. Prima raccoglieresti tutti i servizi attuali con Get-Service
. Get-Service
restituisce quindi molti diversi oggetti di servizio con varie proprietà.
Utilizzando la pipeline di PowerShell, potresti quindi inviare quegli oggetti al cmdlet Where-Object
e utilizzare il parametro FilterScript
. Poiché il parametro FilterScript
accetta uno scriptblock, potresti creare una condizione per verificare se la proprietà StartType
di ciascun oggetto è uguale a Automatico come mostrato di seguito.
Una volta ottenuto lo scriptblock di filtro, lo forniresti al parametro FilterScript
. Where-Object
eseguirebbe quindi lo scriptblock per ogni oggetto che passa attraverso la pipeline e valuterebbe ogni proprietà StartType
. Se la proprietà è uguale a Automatico, Where-Object
passerebbe l’oggetto. In caso contrario, l’oggetto verrebbe scartato.
Puoi vedere un esempio semplice di questa metodologia qui sotto.

Molte persone utilizzano i parametri posizionali con il cmdlet
Where-Object
e non includono il nome del parametroFilterScript
. Invece, forniscono semplicemente lo scriptblock da solo comeWhere-Object {$_.StartType -eq 'Automatico'}
.
Anche se questo tipo di costrutto funziona per questo particolare scenario. Il concetto di uno scriptblock con le parentesi graffe o anche il variabile di pipeline $_
rendono il codice meno leggibile e più difficile per gli utenti PowerShell meno esperti. Questo problema di leggibilità è ciò che ha portato il team di PowerShell a introdurre parametri o dichiarazioni di confronto.
Dichiarazioni di Confronto
Introdotte in Windows PowerShell 3.0, le dichiarazioni di confronto hanno un flusso più “naturale” nella loro costruzione. Utilizzando lo stesso scenario dell’esempio precedente, utilizziamo la costruzione della dichiarazione di confronto per trovare tutti i servizi di Windows con un tipo di avvio “Automatico”:
Notate sopra che invece di utilizzare un blocco di script, il comando specifica la proprietà dell’oggetto come valore del parametro “Property”. L’operatore “eq” è ora anch’esso un parametro che ti permette di passare il valore “Automatico” ad esso.
Utilizzando i parametri in questo modo si elimina del tutto la necessità di un blocco di script.
A scriptblock is a better choice when defining more complex filtering conditions. The
Property
parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!
Nella prossima sezione, imparerai i tipi di operatori di confronto disponibili che possono essere utilizzati con “Where-Object” per filtrare tutte le cose.
Basi del filtraggio
Utilizzando i parametri, “Where-Object” filtra le collezioni di oggetti utilizzando operatori di confronto comuni. Approfondiamo alcuni esempi di come funzionano.
Operatori di contenimento
Gli operatori di contenimento sono utili quando si lavora con collezioni. Gli operatori di contenimento ti consentono di definire una condizione se una collezione “contiene” un elemento o meno.
Ad esempio, diciamo che vuoi filtrare un valore di una determinata proprietà in una collezione. Potresti utilizzare gli operatori di contenimento.
In PowerShell, troverai alcuni operatori di contenimento diversi:
-contains
/-ccontains
– Filtra una collezione che contiene un valore di proprietà.-notcontains
/-cnotcontains
– Filtra una collezione che non contiene un valore di proprietà.-in
/-cin
– il valore è in una collezione, restituisce il valore di proprietà se viene trovata una corrispondenza.-notin
/-cnotin
– il valore non è in una collezione,null
/$false
se non c’è un valore di proprietà.
Per la sensibilità alle maiuscole e minuscole, utilizzare gli operatori di contenimento che iniziano con -c[operatore]
Correlato: Comprensione degli Operatori di Confronto di PowerShell con Esempi
Supponiamo che tu voglia verificare lo stato del servizio Windows BITS. Puoi farlo utilizzando il parametro (operatore) contains
passando il valore di BITS ad esso come mostrato di seguito.
E qui di seguito è quello che ti aspetteresti di vedere:

Ricorda sempre di filtrare a sinistra! L’esempio precedente equivale a eseguire
Get-Service -ServiceName 'BITS'
.
Forse vorresti diventare più sofisticato e trovare tutti i servizi con uno Stato che non è Running e un StartType che è in una singola stringa (o potrebbe essere un array) chiamata Manual. Utilizzando un blocco di script di seguito, il comando sta utilizzando il parametro FilterScript
per passare un blocco di script che valuta entrambe quelle condizioni.
Correlato: Tornare alle Basi: Comprensione degli Oggetti PowerShell
Quando esegui il comando sopra, vedrai solo i servizi che sono fermi e hanno un StartType di Manuale.

Il filtraggio con operatori di contenimento funziona bene con raccolte che contengono molti valori di proprietà. Dato il numero di proprietà restituite da Get-Service
, il filtraggio attraverso tutte queste proprietà è reso più facile quando si combinano operatori di contenimento e operatori logici.
Operatori di corrispondenza
Similmente a come si usano gli operatori di contenimento con Where-Object
, è possibile utilizzare anche operatori di corrispondenza. Gli operatori di corrispondenza ti consentono di trovare corrispondenze tra stringhe. Ad esempio, 'foofoo' -like '*foo*'
restituisce True o 'foofoo' -match 'foo'
restituisce True. Gli operatori di corrispondenza trovano corrispondenze tra stringhe all’interno di stringhe.
In PowerShell, hai alcuni operatori di corrispondenza diversi che puoi utilizzare all’interno di Where-Object
.
-like
/-clike
– una stringa corrisponde a un modello jolly.-notlike
/-cnotlike
– una stringa non corrisponde a un modello jolly.-match
/-cmatch
– una stringa corrisponde a un modello regex.-notmatch
/-cnotmatch
– una stringa non corrisponde a un modello regex
Per la sensibilità delle maiuscole e minuscole, utilizzare gli operatori di corrispondenza che iniziano con
-c[operatore]
Quasi identico nella forma agli operatori di contenimento, puoi usare gli operatori di corrispondenza come mostrato di seguito. L’esempio seguente consiste nel trovare tutti i servizi che hanno Windows nel valore della proprietà DisplayName.

match
operator uses regular expressions to match on certain values.Correlato: Primi passi con PowerShell e Regex
Puoi anche utilizzare l’operatore like
per utilizzare tecniche di corrispondenza comuni come l’uso di un carattere jolly (*
) per corrispondere a qualsiasi carattere o forse un ?
per corrispondere a un singolo carattere.
I risultati sono ora filtrati solo per quei nomi di servizio con ‘Win‘ come primi tre caratteri:

Utilizzare il carattere jolly significa che non è necessario conoscere il nome completo del servizio. Poche lettere della stringa sono tutto ciò di cui hai bisogno. Questi operatori possono anche essere combinati con operatori logici per migliorare ulteriormente il filtraggio.
Operatori di Uguaglianza
Similmente a come si utilizzano gli operatori di contenimento e confronto, è possibile utilizzare anche gli operatori di uguaglianza con Where-Object
. Gli operatori di uguaglianza sono utili quando è necessario confrontare valori numerici.
Per esempio, 1 -eq 1
sarebbe Vero mentre 1 -gt 2
sarebbe Falso. PowerShell ha molti diversi operatori di uguaglianza che puoi utilizzare come parametri di Where-Object
o all’interno di blocchi di script di condizione.
-eq
/-ceq
– valore uguale al valore specificato.-ne
/-cne
– valore non uguale al valore specificato.-gt
/-cgt
– valore maggiore del valore specificato.-ge
/-cge
– valore maggiore o uguale al valore specificato.-lt
/-clt
– valore minore del valore specificato.-le
/-cle
– valore minore o uguale al valore specificato.
Ad esempio, forse vorresti trovare tutti i processi in esecuzione che utilizzano tra il due e il 10 percento della tua CPU. Nessun problema con i cmdlet Get-Process
e Where-Object
di PowerShell.
Utilizzando un blocco di script, puoi combinare due condizioni insieme utilizzando l’operatore and
che le valuterà entrambe. Se entrambe restituiscono True, Where-Object
restituirà l’oggetto processo passato attraverso il pipeline. Se almeno una delle condizioni restituisce False, Where-Object
eliminerà l’oggetto.
Ecco cosa ti aspetteresti di vedere:

Utilizzando gli operatori di uguaglianza di Where-Object
per filtrare ti aiuterà nella creazione di rapporti di sistema o nel confronto di valori.
Passaggi Successivi
Ora che sai di più su come utilizzare il cmdlet Where-Object
di PowerShell per filtrare tutte le cose, cosa altro puoi fare? Prova alcuni compiti di filtraggio più complessi utilizzando condizioni e operatori multipli sulle raccolte per filtrare i valori delle proprietà e formattare l’output a tuo piacimento.
Source:
https://adamtheautomator.com/powershell-where-object/