about_Break
Descrizione breve
Descrive l'istruzione break
, che consente di uscire dal blocco di controllo corrente.
Descrizione lunga
L'istruzione break
consente di uscire dal blocco di controllo corrente.
L'esecuzione continua all'istruzione successiva dopo il blocco di controllo. L'istruzione supporta le etichette. Un'etichetta è un nome assegnato a un'istruzione in uno script.
Uso break
di cicli in
Quando un'istruzione break
viene visualizzata in un ciclo, ad esempio un foreach
ciclo , for
, do
o , while
PowerShell esce immediatamente dal ciclo.
Un'istruzione break
può includere un'etichetta che consente di uscire dai cicli incorporati. Un'etichetta può specificare qualsiasi parola chiave del ciclo, ad esempio foreach
, for
o while
, in uno script.
Nell'esempio seguente viene illustrato come usare un'istruzione break
per uscire da un'istruzione for
:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
In questo esempio l'istruzione break
esce dal for
ciclo quando la $i
variabile è uguale a 1. Anche se l'istruzione for
restituisce True fino a $i
quando non è maggiore di 10, PowerShell raggiunge l'istruzione break la prima volta che viene eseguito il for
ciclo.
È più comune usare l'istruzione break
in un ciclo in cui deve essere soddisfatta una condizione interna. Si consideri l'esempio di istruzione seguente foreach
:
$i=0
$varB = 10,20,30,40
foreach ($val in $varB) {
if ($val -eq 30) {
break
}
$i++
}
Write-Host "30 was found in array index $i"
In questo esempio l'istruzione esegue l'iterazione foreach
della $varB
matrice. L'istruzione if
restituisce False la prima volta che viene eseguito il ciclo e la variabile $i
viene incrementata di 1. La terza volta che viene eseguito il ciclo, $i
uguale a 2 e la $val
variabile è uguale a 30. A questo punto, l'istruzione break
viene eseguita e il foreach
ciclo viene chiuso.
Uso di un'etichetta break
in un ciclo
Un'istruzione break
può includere un'etichetta. Se si usa la break
parola chiave con un'etichetta, PowerShell esce dal ciclo etichettato anziché uscire dal ciclo corrente.
L'etichetta è un punto e due punti seguito da un nome assegnato. L'etichetta deve essere il primo token in un'istruzione e deve essere seguita dalla parola chiave looping, ad esempio while
.
break
sposta l'esecuzione all'esterno del ciclo etichettato. Nei cicli incorporati, questo ha un risultato diverso rispetto alla break
parola chiave quando viene usato da solo. Questo esempio include un'istruzione while
con un'istruzione for
:
:myLabel while (<condition 1>) {
for ($item in $items) {
if (<condition 2>) {
break myLabel
}
$item = $x # A statement inside the For-loop
}
}
$a = $c # A statement after the labeled While-loop
Se la condizione 2 restituisce True, l'esecuzione dello script passa all'istruzione dopo il ciclo etichettato. Nell'esempio l'esecuzione viene avviata di nuovo con l'istruzione $a = $c
.
È possibile annidare molti cicli etichettati, come illustrato nell'esempio seguente.
:red while (<condition1>) {
:yellow while (<condition2>) {
while (<condition3>) {
if ($a) {break}
if ($b) {break red}
if ($c) {break yellow}
}
Write-Host "After innermost loop"
}
Write-Host "After yellow loop"
}
Write-Host "After red loop"
Se la variabile restituisce True, l'esecuzione $b
dello script riprende dopo il ciclo con etichetta "rosso". Se la variabile restituisce True, l'esecuzione $c
del controllo script riprende dopo il ciclo con l'etichetta "giallo".
Se la variabile restituisce True, l'esecuzione $a
riprende dopo il ciclo più interno. Non è necessaria alcuna etichetta.
PowerShell non limita la distanza con cui le etichette possono riprendere l'esecuzione. L'etichetta può anche passare il controllo tra i limiti di script e chiamata di funzione.
Uso break
in un'istruzione switch
In un switch
costrutto, break
powerShell esce dal blocco di switch
codice.
La break
parola chiave viene usata per lasciare il switch
costrutto. Ad esempio, l'istruzione seguente switch
usa istruzioni break
per testare la condizione più specifica:
$var = "word2"
switch -regex ($var) {
"word2" {
Write-Host "Exact" $_
break
}
"word.*" {
Write-Host "Match on the prefix" $_
break
}
"w.*" {
Write-Host "Match on at least the first letter" $_
break
}
default {
Write-Host "No match" $_
break
}
}
In questo esempio la $var
variabile viene creata e inizializzata in un valore stringa di word2
. L'istruzione switch
usa la classe Regex per trovare prima la corrispondenza con il valore della variabile con il termine word2
. Poiché il valore della variabile e il primo test nell'istruzione switch
corrispondono, viene eseguito il primo blocco di codice nell'istruzione switch
.
Quando PowerShell raggiunge la prima break
istruzione, l'istruzione switch
viene chiusa. Se le quattro break
istruzioni vengono rimosse dall'esempio, vengono soddisfatte tutte e quattro le condizioni. In questo esempio viene usata l'istruzione break
per visualizzare i risultati quando viene soddisfatta la condizione più specifica.
Uso break
in un'istruzione trap
Se l'istruzione finale eseguita nel corpo di un'istruzione trap
è break
, l'oggetto di errore viene eliminato e viene generata nuovamente l'eccezione.
Nell'esempio seguente viene creata un'eccezione DivideByZeroException intrappolata usando l'istruzione trap
.
function test {
trap [DivideByZeroException] {
Write-Host 'divide by zero trapped'
break
}
$i = 3
'Before loop'
while ($true) {
"1 / $i = " + (1 / $i--)
}
'After loop'
}
test
Si noti che l'esecuzione si arresta in corrispondenza dell'eccezione. L'oggetto After loop
non viene mai raggiunto.
L'eccezione viene generata nuovamente dopo l'esecuzione trap
.
Before loop
1 / 3 = 0.333333333333333
1 / 2 = 0.5
1 / 1 = 1
divide by zero trapped
Attempted to divide by zero.
At line:10 char:6
+ "1 / $i = " + (1 / $i--)
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
Non usare break
all'esterno di un ciclo, switch
, o trap
Quando break
viene usato all'esterno di un costrutto che lo supporta direttamente (cicli, switch
, trap
), PowerShell cerca lo stack di chiamate per un costrutto di inclusione. Se non riesce a trovare un costrutto di inclusione, lo spazio di esecuzione corrente viene terminato in modalità non interattiva.
Ciò significa che funzioni e script che usano inavvertitamente un break
costrutto esterno a un costrutto che lo supporta può inavvertitamente terminare i chiamanti.
L'uso break
all'interno di una pipeline break
, ad esempio un ForEach-Object
blocco di script, non solo esce dalla pipeline, termina potenzialmente l'intero spazio di esecuzione.