In questo tutorial di PowerShell ti mostriamo come usare il ciclo For, il ciclo ForEach-Object, e i cicli While, Do-While e Do-Until.
I cicli di PowerShell, nella loro forma più elementare, ripetono semplicemente lo stesso insieme di comandi un certo numero di volte. Ideale per eseguire azioni coerenti per un determinato periodo di tempo o per un certo numero di record, i cicli possono semplificare i vostri script in modo notevole. PowerShell in particolare dispone di un certo numero di cmdlets — in particolare quelli che iniziano con il verbo Get — che restituiscono oggetti contenenti un gran numero di dati simili.
Ci sono diversi tipi di loop disponibili in PowerShell, e in molti casi più di una tecnica di loop può essere usata efficacemente. A volte è necessario determinare il tipo di loop più efficiente, sia dal punto di vista delle prestazioni che della leggibilità del codice.
ForEach-Object Loop
In molti casi l’utilizzo della cmdlet ForEach-Object (precedentemente discussa nel nostro articolo sul lavoro con gli oggetti PowerShell) è il modo migliore per eseguire un loop su un oggetto. Nella sua forma più semplice, ForEach-Object richiede solo un oggetto che deve essere analizzato e un blocco di script contenente i comandi da eseguire su ogni membro dell’oggetto. uesti parametri possono essere specificati sia dai nomi dei parametri -InputObject e -Process, sia inviando l’oggetto alla cmdlet ForEach-Object e mettendo il blocco di script come primo parametro. Per illustrare questa sintassi di base, il seguente esempio mostra due metodi di utilizzo di ForEach-Object per scorrere il contenuto della cartella Documenti di un utente:
$myDocuments = Get-ChildItem $env:USERPROFILEDocuments -File
$myDocuments | ForEach-Object {$_.FullName}
ForEach-Object -InputObject $myDocuments -Process {$_.FullName}
In certi scenari può essere utile eseguire una o più azioni subito prima o subito dopo l’esecuzione del ciclo. I parametri -Begin e -End possono essere usati per definire blocchi di script da eseguire appena prima o dopo il contenuto del blocco di script -Process. Questo può essere usato per impostare o modificare una variabile prima o dopo l’esecuzione del ciclo.
ForEach-Object ha due alias, ForEach e %, e supporta anche la sintassi stenografica a partire da PowerShell 3.0. I seguenti tre esempi sono identici nella funzione.
Get-WMIObject Win32_LogicalDisk | ForEach-Object {$_.FreeSpace}
Get-WMIObject Win32_LogicalDisk | ForEach {$_.FreeSpace}
Get-WMIObject Win32_LogicalDisk | % FreeSpace
PowerShell For Loop
I cicli for sono tipicamente utilizzati per iterare attraverso un set di comandi un numero specifico di volte, sia per passare attraverso un array o un oggetto, o semplicemente per ripetere lo stesso blocco di codice come necessario. Un ciclo For è costruito impostando il valore di una variabile quando si entra nel ciclo, la condizione sulla quale il ciclo dovrebbe essere terminato, e un’azione da eseguire su quella variabile ogni volta che si attraversa il ciclo.
L’esempio seguente mostra un ciclo For di base usato per creare una tabella di moltiplicazione:
For ($i=0; $i -le 10; $i++) {
“10 * $i = ” + (10 * $i)
}
I cicli for possono essere usati per scorrere i valori di un array impostando il valore iniziale all’indice iniziale dell’array e aumentando progressivamente il valore fino a raggiungere la lunghezza dell’array. L’indice dell’array è specificato mettendo la variabile incrementata all’interno di parentesi quadre immediatamente dopo il nome della variabile, come mostrato nel seguente esempio:
$colors = @(“Red”, “Orange”, “Yellow”, “Green”, “Blue”, “Indigo”, “Violet”)
For ($i=0; $i -lt $colors.Lunghezza; $i++) {
$colori
}
Circuiti While, Do-While, e Do-Until
Un terzo tipo di ciclo che PowerShell supporta comporta l’impostazione di una condizione che permette al ciclo di elaborare finché la condizione è vera o finché non è soddisfatta. I cicli While e Do-While sono entrambi utilizzati per eseguire un’azione mentre la condizione valuta $true, e differiscono solo nella loro sintassi. I cicli Do-Until hanno una sintassi simile a Do-While, ma fermano l’elaborazione una volta che la condizione è soddisfatta.
I cicli Do-While e Do-Until iniziano entrambi con la parola chiave Do che precede un blocco di script, seguita dalla parola chiave della condizione (While o Until) e dalla condizione. Come esempio i seguenti due cicli funzionano in modo identico, solo la condizione è invertita:
$i=1
Do {
$i
$i++
}
While ($i -le 10)$i=1
Do {
$i
$i++
}
Until ($i -gt 10)
I cicli While si comportano in modo identico ai cicli Do-While, solo la sintassi è leggermente alterata. I cicli While usano solo la parola chiave While, seguita dalla condizione e infine dal blocco di script. Questo ciclo è identico nella funzione agli esempi precedenti, e usa la stessa condizione del ciclo Do-While:
$i=1
While ($i -le 10)
{
$i
$i++
}
Tutti questi tre tipi di loop — Do-While, Do-Until, e While loops — possono anche essere usati per un loop indefinito; I cicli While e Do-While con la condizione impostata su $true e Do-Until con la condizione impostata su $false.
In alcune situazioni potreste aver bisogno di uscire presto da un ciclo basandovi su qualcosa di diverso dalla condizione del ciclo. In questo caso la parola chiave Break può essere invocata per uscire dal ciclo. Questo esempio finale mostra la stessa funzionalità, ma usa un ciclo infinito e la parola chiave Break per uscire al momento opportuno:
$i=1
While ($true)
{
$i
$i++
if ($i -gt 10) {
Break
}
}