Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Breve descrição
Descreve a instrução break, que fornece uma maneira de sair do bloco de controle atual.
Descrição longa
A instrução break 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 declaração apoia rótulos. Um rótulo é um nome que você atribui a uma instrução em um script.
Usando break em loops
Quando uma instrução break aparece em um loop, como um loop de foreach, for, doou while, o PowerShell sai imediatamente do loop.
Uma instrução break pode incluir um rótulo que permite sair de loops incorporados. 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 instrução break para sair de uma instrução for:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
Neste exemplo, a instrução break sai do loop for quando a variável $i é igual a 1. Embora a instrução for seja avaliada como True até que $i seja maior que 10, o PowerShell atinge a instrução break na primeira vez que o loop for é executado.
É mais comum usar a instrução break em um loop onde uma condição interna deve ser atendida. Considere o seguinte exemplo de instrução 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"
Neste exemplo, a instrução foreach itera a matriz $varB. A instrução if avalia como False as duas primeiras vezes que o loop é executado e a variável $i é incrementada em 1. Na terceira vez que o loop é executado, $i é igual a 2 e a variável $val é igual a 30. Neste ponto, a instrução break é executada e o loop de foreach é encerrado.
Usando um break rotulado em um loop
Uma declaração break pode incluir um rótulo. Se você usar a palavra-chave break com um rótulo, o PowerShell sairá do loop rotulado em vez de sair do loop atual.
O rótulo é dois pontos 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 looping, como while.
break move a execução para fora do loop rotulado. Em loops incorporados, isso tem um resultado diferente do break palavra-chave tem quando é usada por si só. Este exemplo tem uma instrução while com uma instrução for:
:myLabel while (<condition 1>) {
foreach ($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 pulará 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 variável $b for avaliada como True, a execução do script será retomada após o loop rotulado como "vermelho". Se a variável $c for avaliada como True, a execução do controle de script será retomada após o loop rotulado como "amarelo".
Se a variável $a for avaliada como True, a execução será retomada após o loop mais interno. Não é necessário rótulo.
O PowerShell não limita até onde os rótulos podem retomar a execução. O rótulo pode até mesmo passar o controle através dos limites de chamada de script e função.
Usando break em uma switch instrução
Em uma switch construção, break faz com que o PowerShell saia do switch bloco de código.
A palavra-chave break é usada para deixar a construção switch. Por exemplo, a instrução switch a seguir usa instruções break 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 variável $var é criada e inicializada com um valor de cadeia de caracteres de word2. A instrução switch usa a classe Regex para corresponder o valor da variável primeiro com o termo word2. Como o valor da variável e o primeiro teste na instrução switch correspondem, o primeiro bloco de código na instrução switch é executado.
Quando o PowerShell atinge a primeira instrução break, a instrução switch é encerrada. Se as quatro instruções break forem removidas do exemplo, todas as quatro condições serão atendidas. Este exemplo usa a instrução break para exibir resultados quando a condição mais específica é atendida.
Usando break em uma trap instrução
Se a instrução final executada no corpo de uma instrução trap for break, o objeto error será suprimido e a exceção será relançada.
O exemplo a seguir cria uma exceção DivideByZeroException que está presa usando a instrução 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
Observe que a execução termina na exceção. A After loop nunca é alcançada. A exceção é relançada após a execução do 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.
Não utilizar break fora de um circuito, switchou trap
Quando break é usado fora de uma construção que oferece suporte direto a ele (loops, switchtrap), o PowerShell procura pilha de chamadas para uma construção anexa. Se não for possível encontrar uma construção envolvente, o espaço de execução atual será encerrado silenciosamente.
Isso significa que funções e scripts que usam inadvertidamente um break fora de uma construção anexa que suporta ele podem inadvertidamente encerrar seus chamadores .
Usar break dentro de um pipeline break, como um ForEach-Object bloco de scripts, não só sai do pipeline, como potencialmente termina todo o espaço de execução.