about_Break
Descrição breve
Descreve a break
instrução, que fornece uma maneira de sair do bloco de controle atual.
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 suporta rótulos. Um rótulo é um nome que você atribui a uma instrução em um script.
Usando break
loops in
Quando uma break
instrução aparece em um loop, como um foreach
loop , for
, do
, ou , , sai while
imediatamente do loop.
Uma break
instrução pode incluir um rótulo que permite sair de loops incorporados. Um rótulo pode especificar qualquer palavra-chave de loop, como foreach
, for
, ou 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 $i
variável é igual a 1. Mesmo que a instrução seja avaliada for
como True until $i
seja maior que 10, o PowerShell alcança a instrução break na primeira vez 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 itera foreach
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. Na terceira vez, $i
o loop é executado é igual a 2 e a $val
variável é igual a 30. Neste ponto, a break
instrução é executada e o foreach
loop é encerrado.
Usando um rótulo break
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 é dois-pontos seguidos 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 que a break
palavra-chave tem quando é usada sozinha. 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 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 $b
variável for avaliada como True, a execução do script será retomada após o loop rotulado como "vermelho". Se a variável for avaliada $c
como True, a execução do controle de script será retomada após o loop rotulado como "amarelo".
Se a variável for avaliada $a
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é mesmo passar o controle entre os 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 break
palavra-chave é usada para sair da switch
construção. 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 com um valor de cadeia de caracteres de word2
. A switch
instrução usa a classe Regex para corresponder o valor da variável primeiro com o termo word2
. Como o valor da variável e o switch
primeiro teste na 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 break
em uma trap
instrução
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 é interceptada 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 é interrompida na exceção. O After loop
nunca é alcançado.
A exceção é lançada novamente após as trap
execuções.
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 use break
fora de um loop, switch
ou trap
Quando break
é usado fora de um constructo que dá suporte diretamente a ele (loops, switch
, trap
), o PowerShell procura a pilha de chamadas para um constructo delimitador. Se ele não conseguir encontrar uma construção delimitadora, o runspace atual será encerrado silenciosamente.
Isso significa que funções e scripts que inadvertidamente usam uma break
parte externa de uma construção delimitadora que dá suporte a ela podem encerrar inadvertidamente seus chamadores.
O uso break
dentro de um pipeline break
, como um ForEach-Object
bloco de script, não apenas sai do pipeline, mas também encerra potencialmente todo o runspace.