Condividi tramite


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 foreachciclo , for, doo , 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, foro 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 switchcostrutto, 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
ParentContainsErrorRecordException:
Line |
  10 |       "1 / $i = " + (1 / $i--)
     |       ~~~~~~~~~~~~~~~~~~~~~~~~
     | Attempted to divide by zero.

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.

Vedi anche