• 12/23/2019
  • 4 minuti per leggere
    • j
    • s
    • m

In PowerShell, spesso si generano e si passano ad una pipeline più oggetti di quanti se ne desiderino. Puoi specificare le proprietà di particolari oggetti da visualizzare usando le cmdlets Format-*, ma questo non aiuta con il problema di rimuovere interi oggetti dalla visualizzazione. Potresti voler filtrare gli oggetti prima della fine di una pipeline, in modo da poter eseguire azioni solo su un sottoinsieme degli oggetti generati inizialmente.

PowerShell include un Where-Object cmdlet che ti permette di testare ogni oggetto nella pipeline e farlo passare lungo la pipeline solo se soddisfa una particolare condizione di test. Gli oggetti che non superano il test vengono rimossi dalla pipeline. Fornisci la condizione di test come valore del parametro FilterScript.

Eseguire semplici test con Where-Object

Il valore di FilterScript è un blocco di script – uno o più comandi PowerShell circondati da parentesi ({}) – che valuta vero o falso. Questi blocchi di script possono essere molto semplici, ma la loro creazione richiede la conoscenza di un altro concetto di PowerShell, gli operatori di confronto. Un operatore di confronto confronta gli elementi che appaiono su ciascun lato di esso. Gli operatori di confronto iniziano con un trattino (-) e sono seguiti da un nome. Gli operatori di confronto di base funzionano su quasi ogni tipo di oggetto. Gli operatori di confronto più avanzati potrebbero funzionare solo su testo o array.

Nota

Di default, quando si lavora con il testo, gli operatori di confronto di PowerShell sono case-insensitive.

A causa di considerazioni di parsing, simboli come <,>, e = non sono usati come operatori di confronto. Invece, gli operatori di confronto sono composti da lettere. Gli operatori di confronto di base sono elencati nella seguente tabella.

Operatore di confronto Significato Esempio (ritorna vero)
-eq è uguale a 1 -eq 1
-ne non è uguale a 1 -ne 2
-lt è minore di 1 -lt 2
-le È minore o uguale a 1 -le 2
-gt È maggiore di 2 -gt 1
-ge È maggiore o uguale a 2 -ge 1
-like È come (confronto jolly per testo) “file.doc” -like “f*.do?”
-notlike Non è come (confronto jolly per testo) “file.doc” -notlike “p*.doc”
-contiene contiene 1,2,3 -contiene 1
-non contiene non contiene 1,2,3 -non contiene 4

Where-Object i blocchi di script usano la variabile speciale $_ per riferirsi all’oggetto corrente nella pipeline. Ecco un esempio di come funziona. Se avete una lista di numeri, e volete restituire solo quelli che sono inferiori a 3, potete usare Where-Object per filtrare i numeri digitando:

1,2,3,4 | Where-Object {$_ -lt 3}12

Filtraggio basato sulle proprietà dell’oggetto

Siccome $_ si riferisce all’oggetto corrente della pipeline, possiamo accedere alle sue proprietà per i nostri test.

Come esempio, possiamo guardare la classe Win32_SystemDriver in WMI. Potrebbero esserci centinaia di driver di sistema su un particolare sistema, ma potreste essere interessati solo a un particolare insieme di driver di sistema, come quelli che sono attualmente in esecuzione. Per la classe Win32_SystemDriver la proprietà rilevante è State. Potete filtrare i driver di sistema, selezionando solo quelli in esecuzione, digitando:

Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}

Questo produce ancora una lunga lista. Potreste voler filtrare per selezionare solo i driver impostati per l’avvio automatico testando anche il valore 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...

Questo ci dà un sacco di informazioni di cui non abbiamo più bisogno perché sappiamo che i driver sono in esecuzione.Infatti, le uniche informazioni di cui probabilmente abbiamo bisogno a questo punto sono il nome e il nome visualizzato. Il comando seguente include solo queste due proprietà, ottenendo un output molto più semplice:

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...

Ci sono due elementi Where-Object nel comando precedente, ma possono essere espressi in un singolo elementoWhere-Object usando l’operatore logico -and, come questo:

Get-CimInstance -Class Win32_SystemDriver | Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} | Format-Table -Property Name,DisplayName

Gli operatori logici standard sono elencati nella tabella seguente.

Operatore logico Significato Esempio (ritorna vero)
-e Logico e; vero se entrambe le parti sono vere (1 -eq 1) -e (2 -eq 2)
-or Logico or; vero se uno dei due lati è vero (1 -eq 1) -o (1 -eq 2)
-non Logico non; inverte vero e falso -non (1 -eq 2)
! Logico non; inverte vero e falso !(1 -eq 2)

admin

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

lg