Come utilizzare il comando Where-Object in PowerShell

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

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' }
Nota
Molte persone usano parametri posizionali con il cmdlet 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
Ti piacciono i nostri tutorial? Iscriviti a DelftStack su YouTube per aiutarci a creare altre guide video di alta qualità. Iscriviti
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Articolo correlato - PowerShell Statement