In Windows PowerShell si genera e si passa attraverso la pipeline un numero di oggetti superiore a quello desiderato. È possibile utilizzare i cmdlet di tipo Format per specificare le proprietà di determinati oggetti da visualizzare. Tale soluzione non consente di risolvere il problema della rimozione di interi oggetti dalla visualizzazione. È infatti preferibile filtrare gli oggetti prima della fine di una pipeline, in modo da eseguire le azioni solo su un subset degli oggetti generati inizialmente.
Windows PowerShell include un cmdlet Where-Object che consente di testare i singoli oggetti della pipeline e di passare solo quelli che soddisfano una determinata condizione di test. Gli oggetti che non superano il test verranno rimossi dalla pipeline. La condizione di test deve essere specificata come valore del parametro Where-Object FilterScript .
Esecuzione di semplici test con Where-Object
Il valore di FilterScript è un blocco di script, ovvero uno o più comandi di Windows PowerShell racchiusi tra parentesi graffe {}, che restituisce true o false. Tali blocchi di script possono essere molto semplici, tuttavia per crearli è necessario conoscere gli operatori di confronto, un'altra funzionalità di Windows PowerShell. Un operatore di confronto consente di confrontare gli elementi riportati prima e dopo di esso. Gli operatori di confronto iniziano con un carattere '-' e sono seguiti da un nome. Operatori di confronto di base possono essere utilizzati su quasi ogni tipo di oggetto. È possibile che gli operatori di confronto più complessi siano utilizzabili solo su testo o su matrici.
Nota | |
Per impostazione predefinita, quando vengono utilizzati su testo, gli operatori di confronto di Windows PowerShell non fanno distinzione tra maiuscole e minuscole. |
Per considerazioni correlate all'analisi, come operatori di confronto non vengono utilizzati simboli quali <,> e =. bensì lettere. Nella tabella seguente sono elencati gli operatori di confronto di base.
Operatore di confronto | Significato | Esempio (restituisce True) |
---|---|---|
-eq |
È uguale a |
1 -eq 1 |
-ne |
È diverso da |
1 -ne 2 |
-lt |
È minore di |
1 -lt 2 |
-le |
È minore di o uguale a |
1 -le 2 |
-gt |
È maggiore di |
2 -gt 1 |
-ge |
È maggiore di o uguale a |
2 -ge 1 |
-like |
È simile a (confronto con caratteri jolly per il testo) |
"file.doc" -like "f*.do?" |
-notlike |
Non simile a (confronto con caratteri jolly per il testo) |
"file.doc" -notlike "p*.doc" |
-contains |
Contiene |
1,2,3 -contains 1 |
-notcontains |
Non contiene |
1,2,3 -notcontains 4 |
Nei blocchi di script Where-Object la variabile speciale '$_' viene utilizzata per fare riferimento all'oggetto corrente della pipeline. Di seguito è riportato un esempio del funzionamento di Where-Object. Se si dispone di un elenco di numeri e si desidera che vengano restituiti solo quelli minori di 3, è possibile utilizzare Where-Object per filtrare i numeri digitando:
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3} 1 2
Filtraggio in base alle proprietà degli oggetti
Poiché $_ fa riferimento all'oggetto corrente della pipeline, è possibile accedere alle relative proprietà per i test da eseguire.
A titolo di esempio è possibile esaminare la classe Win32_SystemDriver in WMI. Tra le centinaia di driver disponibili in un determinato sistema è possibile che si sia interessati a un set specifico, che include ad esempio quelli attualmente in esecuzione. Se si utilizza Get-Member per visualizzare i membri di Win32_SystemDriver (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), si noterà che la proprietà pertinente è State e che il valore di tale proprietà è "Running" quando il driver è in esecuzione. È quindi possibile filtrare i driver di sistema e selezionare solo quelli in esecuzione digitando:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
L'elenco restituito sarà comunque particolarmente lungo. È quindi possibile che si desideri filtrarlo in modo da selezionare solo i driver impostati per l'avvio automatico tramite la verifica del valore di StartMode:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"} DisplayName : RAS Asynchronous Media Driver Name : AsyncMac State : Running Status : OK Started : True DisplayName : Audio Stub Driver Name : audstub State : Running Status : OK Started : True
In questo modo verranno restituite molte informazioni che non risultano più necessarie perché è noto che i driver sono in esecuzione. Infatti, le uniche informazioni necessarie in questa fase sono probabilmente il nome e il nome visualizzato. Nel comando seguente vengono incluse solo queste due proprietà, garantendo un output molto più semplice:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName Name DisplayName ---- ----------- AsyncMac RAS Asynchronous Media Driver Fdc Floppy Disk Controller Driver Flpydisk Floppy Disk Driver Gpc Generic Packet Classifier IpNat IP Network Address Translator mouhid Mouse HID Driver MRxDAV WebDav Client Redirector mssmbios Microsoft System Management BIOS Driver
Il comando precedente include due elementi Where-Object che tuttavia possono essere espressi in un unico elemento Where-Object tramite l'operatore logico -and, come nell'esempio seguente:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
Nella tabella seguente sono elencati gli operatori logici standard.
Operatore logico | Significato | Esempio (restituisce True) |
---|---|---|
-and |
And logico. Restituisce true se il valore di entrambi gli elementi è true |
(1 -eq 1) -and (2 -eq 2) |
-or |
Or logico. Restituisce true se il valore di uno degli elementi è true |
(1 -eq 1) -or (1 -eq 2) |
-not |
Not logico. Inverte true e false |
-not (1 -eq 2) |
! |
Not logico. Inverte true e false |
!(1 -eq 2) |