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)




Argomenti della Guida