Sobre o Break

Descrição breve

Descreve uma instrução que você pode usar para sair foreachimediatamente, for, while, do, switchou trap instruções.

Descrição longa

A break instrução fornece uma maneira de sair do bloco de controle atual. A execução continua na próxima instrução após o bloco de controle. A instrução dá suporte a rótulos. Um rótulo é um nome que você atribui a uma instrução em um script.

Usando loops de interrupção

Quando uma break instrução aparece em um loop, como um loop ou while um foreachloopfordo, o PowerShell sai imediatamente do loop.

Uma break instrução pode incluir um rótulo que permite sair de loops inseridos. Um rótulo pode especificar qualquer palavra-chave de loop, como foreach, forou while, em um script.

O exemplo a seguir mostra como usar uma break instrução para sair de uma for instrução:

for($i=1; $i -le 10; $i++) {
   Write-Host $i
   break
}

Neste exemplo, a break instrução sai do for loop quando a variável é igual a $i 1. Embora a instrução for seja avaliada como True até $i que seja maior que 10, o PowerShell atinge a instrução de interrupção na primeira vez em que o for loop é executado.

É mais comum usar a break instrução em um loop em que uma condição interna deve ser atendida. Considere o seguinte foreach exemplo de instrução:

$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"

Neste exemplo, a instrução foreach itera a $varB matriz. A if instrução é avaliada como False nas duas primeiras vezes em que o loop é executado e a variável $i é incrementada em 1. A terceira vez que o loop é executado, $i é igual a 2 e a variável é igual a $val 30. Neste ponto, a break instrução é executada e o foreach loop é encerrado.

Usando uma quebra rotulada em um loop

Uma break instrução pode incluir um rótulo. Se você usar a break palavra-chave com um rótulo, o PowerShell sairá do loop rotulado em vez de sair do loop atual. O rótulo é um ponto de extremidade seguido por um nome que você atribui. O rótulo deve ser o primeiro token em uma instrução e deve ser seguido pela palavra-chave de looping, como while.

break move a execução para fora do loop rotulado. Em loops inseridos, isso tem um resultado diferente do que a break palavra-chave tem quando é usado por si só. Este exemplo tem uma while instrução com uma for instrução:

: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 a condição 2 for avaliada como True, a execução do script será ignorada para a instrução após o loop rotulado. No exemplo, a execução começa novamente com a instrução $a = $c.

Você pode aninhar muitos loops rotulados, conforme mostrado no exemplo a seguir.

: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 a $b variável for avaliada como True, a execução do script será retomada após o loop rotulado como "vermelho". Se a $c variável for avaliada como True, a execução do controle de script será retomada após o loop rotulado como "amarelo".

Se a $a variável for avaliada como True, a execução será retomada após o loop mais interno. Nenhum rótulo é necessário.

O PowerShell não limita até que ponto os rótulos podem retomar a execução. O rótulo pode até passar o controle entre os limites de chamada de script e função.

Usando a quebra em uma instrução switch

Em um switchconstructo, break faz com que o PowerShell saia do switch bloco de código.

A break palavra-chave é usada para deixar o switch constructo. Por exemplo, a instrução a seguir switch usa break instruções para testar a condição mais específica:

$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
    }
}

Neste exemplo, a $var variável é criada e inicializada para um valor de cadeia de caracteres de word2. A switch instrução usa a classe Regex para corresponder primeiro ao valor da variável com o termo word2. Como o valor da variável e o primeiro teste na switch instrução correspondem, o primeiro bloco de código na switch instrução é executado.

Quando o PowerShell atinge a primeira break instrução, a switch instrução é encerrada. Se as quatro break instruções forem removidas do exemplo, todas as quatro condições serão atendidas. Este exemplo usa a break instrução para exibir resultados quando a condição mais específica é atendida.

Usando a quebra em uma instrução trap

Se a instrução final executada no corpo de uma trap instrução for break, o objeto de erro será suprimido e a exceção será lançada novamente.

O exemplo a seguir cria uma exceção DivideByZeroException que está presa usando a trap instrução.

function test {
  trap [DivideByZeroException] {
    Write-Host 'divide by zero trapped'
    break
  }

  $i = 3
  'Before loop'
  while ($true) {
     "1 / $i = " + (1 / $i--)
  }
  'After loop'
}
test

Observe que a execução para na exceção. O After loop é nunca alcançado. A exceção é gerada novamente após a execução 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

Não use quebra fora de um loop, comutador ou armadilha

Quando break é usado fora de um constructo que dá suporte direto a ele (loops, switch, trap), o PowerShell procura a pilha de chamadas para um constructo de conexão. Se ele não conseguir encontrar um constructo circunscrito, o runspace atual será encerrado silenciosamente.

Isso significa que funções e scripts que usam inadvertidamente um break fora de um constructo que dá suporte a ele podem encerrar inadvertidamente seus chamadores.

O uso break dentro de um pipeline break, como um ForEach-Object bloco de script, não só sai do pipeline, como potencialmente encerra todo o runspace.

Confira também

about_Comparison_Operators

about_Continue

about_For

about_Foreach

about_Switch

about_Throw

about_Trap

about_Try_Catch_Finally

about_While