Rimozione di oggetti dalla pipeline
In PowerShell spesso si generano e si passano a una pipeline più oggetti di quelli desiderati. È possibile specificare le proprietà di oggetti specifici da visualizzare usando i Format-*
cmdlet, ma ciò non consente di risolvere il problema di rimuovere interi oggetti dalla visualizzazione. È possibile filtrare gli oggetti prima della fine di una pipeline, in modo da poter eseguire azioni solo su un subset degli oggetti inizialmente generati.
PowerShell include un cmdlet Where-Object
che consente di testare ogni oggetto nella pipeline e passarlo lungo la pipeline solo se soddisfa una specifica condizione di test. Gli oggetti che non superano il test vengono rimossi dalla pipeline. La condizione di test viene specificata sotto forma di valore del parametro FilterScript.
Esecuzione di test semplici con Where-Object
Il valore di FilterScript è un blocco di script, ovvero uno o più comandi di PowerShell racchiusi tra parentesi graffe ({}
), che restituisce true o false. Questi blocchi di script possono essere semplici, ma la loro creazione richiede conoscere un altro concetto di PowerShell, operatori di confronto. Un operatore di confronto mette a confronto gli elementi visualizzati alle sue due estremità. Gli operatori di confronto iniziano con un segno meno (-
) e sono seguiti da un nome. Gli operatori di confronto di base possono essere usati con qualsiasi tipo di oggetto. Quelli più avanzati potrebbero funzionare solo su testo o array.
Nota
Per impostazione predefinita, gli operatori di confronto di PowerShell non fanno distinzione tra maiuscole e minuscole.
A causa delle considerazioni sull'analisi, i simboli come <
,>
e =
non vengono usati come operatori di confronto. Al contrario, gli operatori di confronto possono essere costituiti da 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 | non è uguale a | 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 | Corrisponde (confronto con caratteri jolly per il testo) | "file.doc" -like "f*.do?" |
-notlike | non è simile (confronto con caratteri jolly per il testo) | "file.doc" -notlike "p*.doc" |
contiene | Contiene | 1,2,3 -contains 1 |
-notcontains | non contiene | 1,2,3 -notcontains 4 |
I blocchi di script Where-Object
usano la variabile speciale $_
per fare riferimento all'oggetto corrente nella pipeline. Di seguito è riportato un esempio del funzionamento. Se si ha un elenco di numeri e si vogliono restituire solo quelli minori di 3, è possibile usare Where-Object
per filtrare i numeri digitando:
1,2,3,4 | Where-Object {$_ -lt 3}
1
2
Applicazione di filtri in base alle proprietà degli oggetti
Dal momento che $_
fa riferimento all'oggetto della pipeline corrente, è possibile accedere alle relative proprietà per i test.
Esaminare ad esempio la classe Win32_SystemDriver in WMI. Potrebbero esserci centinaia di driver di sistema in un particolare sistema, ma potresti essere interessato solo a un determinato set di driver di sistema, ad esempio quelli in esecuzione. Per la classe Win32_SystemDriver la proprietà rilevante è State. È possibile filtrare i driver di sistema selezionando solo quelli in esecuzione digitando:
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq 'Running'}
Questa operazione genera comunque un lungo elenco. Può essere opportuno applicare un filtro 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 Driver
Name : AsyncMac
State : Running
Status : OK
Started : True
DisplayName : Audio Stub Driver
Name : audstub
State : Running
Status : OK
Started : True
...
Questa operazione produce numerose informazioni che non sono più necessarie poiché è noto che i driver sono in esecuzione. In effetti, le uniche informazioni che a questo punto risultano probabilmente necessarie sono il nome e il nome visualizzato. Il comando seguente include solo queste due proprietà, generando 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 Driver
bindflt Windows Bind Filter Driver
bowser Browser
CompositeBus Composite Bus Enumerator Driver
condrv Console Driver
HdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus Microsoft UAA Bus Driver for High Definition Audio
HidUsb Microsoft HID Class Driver
HTTP HTTP Service
igfx igfx
IntcDAud Intel(R) Display Audio
intelppm Intel Processor Driver
...
Nel comando precedente sono presenti due Where-Object
elementi, ma possono essere espressi in un singolo Where-Object
elemento usando l'operatore -and
logico, come illustrato di seguito:
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {($_.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; true se i valori a entrambe le estremità sono true | (1 -eq 1) -and (2 -eq 2) |
-or |
OR logico; true se i valori a entrambe le estremità sono 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) |