Il Ciclo While di PowerShell: Una Guida di Base

PowerShell è un potente linguaggio di scripting che offre molte funzionalità per l’automazione e la gestione dei sistemi basati su Windows. Uno dei costrutti più comunemente utilizzati è il ciclo `while` di PowerShell.

Non preoccuparti se sei rimasto bloccato in un ciclo infinito mentre cercavi di imparare lo scripting di PowerShell. Lascia che il ciclo `while` di PowerShell ti guidi verso la tua grande fuga. E in questo tutorial, tornerai alle basi del lavoro con i cicli `while` in PowerShell mentre scrivi i tuoi script.

Continua a leggere per portare le tue competenze nello scripting di PowerShell al livello successivo!

Prerequisiti

Questo tutorial sarà una dimostrazione pratica. Per seguire, assicurati di avere quanto segue:

  • A Windows machine – This tutorial uses Windows 10.
  • Windows PowerShell 5.0 o versione successiva installato – Questo tutorial utilizza PowerShell 7.
  • A user account with administrator privileges.

Esecuzione di cicli `while` con singola condizione

Uno dei tipi più semplici di ciclo `while` è il tipo a singola condizione. A differenza dell’istruzione `If`, questo tipo di ciclo esegue un insieme di comandi specificati finché una condizione specificata viene valutata come vera. Quando viene restituito un valore ‘Falso’, il ciclo si interrompe e l’esecuzione continua con il resto dello script.

Di seguito è riportata la sintassi per un ciclo while con una singola condizione:

  • La prima cosa che si nota è l’uso delle parentesi. La condizione deve essere racchiusa tra parentesi, mentre il blocco di codice è un insieme di comandi PowerShell che viene eseguito mentre la condizione è vera.
  • La seconda cosa da notare è che la condizione deve restituire un valore Booleano, che si valuta in Vero o Falso.
while (condition)
{

	# Blocco di codice da eseguire

}

Esegui il codice sottostante, dove il valore di $val inizia da 0 e viene incrementato di 1 ogni volta che il blocco di codice viene eseguito fino a quando il valore della variabile $val equivale a 3.

Quando $val raggiunge un valore di 3, il che rende la condizione Falsa, il ciclo si interrompe e l’esecuzione continua con il resto dello script.

# Dichiarare la variabile $val con il valore iniziale di 0
$val = 0

# Imposta il ciclo while per eseguire fino a quando il valore della variabile $val raggiunge 3
while($val -ne 3)
{
	# Incrementa il valore della variabile $val di 1
	$val++
	
	# Stampa il valore corrente della variabile $val
	Write-Host $val
}
Understanding Single Condition While Loops.

Esecuzione del ciclo While di PowerShell con variabili incorporate ($true/$false)

L’esempio precedente, utilizzando condizioni nel ciclo while, funziona bene. Ma è anche possibile utilizzare le variabili incorporate di PowerShell, come $true e $false, per creare un ciclo While.

La sintassi seguente si esegue fino a quando $true non è più $true. In altre parole, il ciclo si esegue all’infinito. Ma è necessario includere sempre un modo per uscire da un ciclo infinito. Altrimenti, si rimane bloccati per sempre. Apprenderai di più su come uscire da un ciclo utilizzando break e continue più avanti in questo tutorial.

while($true)
{

	# Blocco di codice da eseguire

}

Esegui il blocco di codice qui sotto, che si esegue all’infinito, stampando il valore di $i sulla console.

# Dichiara la variabile $i con il valore iniziale di 0
$i = 0

# Imposta il ciclo While per eseguire mentre la condizione è $true
while($true)
{
	# Incrementa il valore di $i di 1
	$i++
	
	# Stampa il valore corrente della variabile $i
	Write-Host $i
}

Ora, premi Ctrl+C per uscire dal ciclo. Questo ciclo consuma molte risorse di sistema, quindi fai attenzione quando li usi.

Executing a while loop with PowerShell’s built-in ($true) variable

Esecuzione di cicli While multi-condizione

Oltre ai cicli while a singola condizione, è possibile creare anche cicli while a condizioni multiple. Come nel caso del ciclo while a singola condizione, le condizioni devono restituire un valore booleano, True o False.

Di seguito è riportata la sintassi per un ciclo while a condizioni multiple, simile alla sintassi per un ciclo while a singola condizione. La differenza principale è che è possibile includere più condizioni separate dagli operatori seguenti:

  • AND (-and) – Entrambe le condizioni devono essere vere.
  • OR (-or) (Una delle due condizioni può essere vera).
# Operatore AND
while (condition1 -AND condition2)
{

	# Blocco di codice da eseguire

}

# Operatore OR
while (condition1 -OR condition2)
{

	# Blocco di codice da eseguire

}

Esegui il codice seguente, che cicla finché $val non è uguale (-ne) a 3 -and $i non è uguale (-ne) a 5.

Quando entrambi i valori delle variabili raggiungono le rispettive condizioni, il ciclo si interrompe e l’esecuzione continua con il resto dello script.

# Dichiara le variabili $val e $i con valori iniziali di 0
$val = 0
$i = 0

# Imposta il ciclo While per eseguire finché $val è uguale a 3 e $i è uguale a 5
while($val -ne 3 -and $i -ne 6)
{
	# Incrementa $val di 1
  $val++
	# Incrementa $i di 2
  $i += 2
	# Stampa il valore corrente delle variabili $val e $i
  Write-Host "$val, $i"
}

Esecuzione di un ciclo while con operatore AND

Executing a while loop with AND operator

Ora, esegui il codice sottostante, che chiede all’utente la propria età, memorizzata nella variabile $age.

Se l’utente inserisce un numero inferiore a (-lt) 1 o non è un numero (-nomatch), allora all’utente viene chiesto di inserire nuovamente un numero valido. Questo comportamento è utile per dare agli utenti più possibilità di inserire un input valido.

# Richiede agli utenti di inserire la propria età
$age = Read-Host "Please Enter Your Age"

# Imposta il ciclo While per eseguire fino a quando l'utente fornisce un input valido
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# Richiede nuovamente all'utente di inserire un'età valida
  $age = Read-Host "Please Enter Your Valid Age"
}
# Stampa l'input di età valido
Write-Host "Your age is $age

Nel risultato qui sotto, puoi vedere che all’utente è stato chiesto di inserire la propria età tre volte, come segue:

  • La prima volta, l’utente ha inserito dieci, che non è un numero.
  • La seconda volta, l’utente ha inserito 0, che è inferiore a 1.
  • La terza volta, l’utente ha inserito 10, che è un’età valida.
Executing a while loop with the OR operator

Utilizzo delle parole chiave BREAK e CONTINUE nei cicli While

Hai visto come i cicli while aggiungono flessibilità allo script PowerShell. Ma per controllare meglio l’esecuzione dei tuoi cicli While, aggiungi le parole chiave break e continue.

Per esempio, se desideri elaborare solo un certo numero di elementi in un array, puoi utilizzare la parola chiave BREAK per uscire dal ciclo quando il numero desiderato di elementi è stato elaborato.

Queste parole chiave funzionano nel seguente modo:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

Esegui il codice sottostante, che cicla attraverso un array di 10 elementi.

Nel codice sottostante, l’istruzione if controlla il valore di $i. Se il valore di $i è 5, la parola chiave continue salta il resto del codice nel ciclo e continua con l’iterazione successiva. Se il valore di $i è 8, la parola chiave break esce dal ciclo e continua con il resto dello script.

Altrimenti, il ciclo while stampa (Write-Host) e incrementa il valore della variabile $i di 1.

# Dichiara un $array di 10 elementi
$array = 1..10
# Dichiara la variabile $i con valore iniziale 0
$i = 0
# Imposta il ciclo While per eseguire fino a quando la condizione è soddisfatta
while($i -lt $array.Count)
{
	# Verifica se $i è uguale a 5
  if($i -eq 5)
  {
		# Se sì, incrementa $i di 1
    $i++
		# Continua con la prossima iterazione
    continue
  }
	# Verifica se $i è uguale a 8
  if($i -eq 8)
  {
		# Se sì, interrompi il ciclo While e continua con il resto dello script
    break
  }
	# Stampa il valore corrente di $i
  Write-Host "Processing item $i"
	# Incrementa $1 di 1
  $i++
}

Come puoi vedere nell’output sottostante, il ciclo ha saltato il quinto e l’ottavo elemento nell’array. Il while loop ha elaborato tutti gli altri elementi nell’array ed è uscito dopo aver raggiunto l’ottavo elemento.

Executing a while loop with break and continue keywords

Limitare il Tempo di Esecuzione di un Ciclo While

In genere, potresti voler limitare il tempo di esecuzione di un ciclo. Forse stai cercando di connetterti a un server remoto. In tal caso, puoi dare al server il tempo di rispondere prima di terminare il ciclo utilizzando il cmdlet Start-Sleep all’interno del tuo ciclo while.

Il cmdlet Start-Sleep mette in pausa l’esecuzione dello script per un periodo di tempo specificato.

Esegui il codice qui sotto per ottenere e memorizzare la data e l’ora correnti con il comando Get-Date nella variabile $startTime. Il ciclo while continua finché la data/ora corrente è di meno di 10 secondi dal valore memorizzato in $startTime.

Mentre il ciclo while viene eseguito, viene stampato un messaggio mentre il cmdlet Start-Sleep mette in pausa l’esecuzione dello script per 1 secondo.

Il blocco di codice qui sotto è solo uno scheletro per ciò che useresti effettivamente in pratica. Puoi inserire altro nel codice all’interno del ciclo secondo necessità.

# Ottieni e memorizza la data/ora attuale
$startTime = Get-Date
# Imposta il loop While per eseguirsi finché la data/ora attuale è inferiore a 10 secondi 
	# dal valore memorizzato in $startTime.
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# Stampa un messaggio
  Write-Host "Waiting for server to respond..."
	# Mette in pausa lo script per un secondo
  Start-Sleep -Seconds 1
}

Sotto, puoi vedere che il loop è continuato ad eseguirsi per 10 secondi prima di uscire dal loop.

Limiting the time a while loop runs

Conclusione

I loop while di PowerShell sono utili quando si affrontano concetti complessi per evitare di rimanere bloccati in un loop o mentre si scrivono gli script. E in questo tutorial, hai imparato molti modi per lavorare con i loop while per script più flessibili e potenti.

Con questa nuova conoscenza, il cielo è il limite. Quindi perché non massimizzare l’uso di operatori logici e parole chiave per automatizzare compiti con i tuoi script?

Source:
https://adamtheautomator.com/powershell-while-loop/