about_Break
Descripción breve
Describe la break
instrucción , que proporciona una manera de salir del bloque de control actual.
Descripción larga
La break
instrucción proporciona una manera de salir del bloque de control actual.
La ejecución continúa en la siguiente instrucción después del bloque de control. La instrucción admite etiquetas. Una etiqueta es un nombre que se asigna a una instrucción en un script.
Uso de break
bucles in
Cuando una break
instrucción aparece en un bucle, como un foreach
bucle , for
, do
o while
, PowerShell sale inmediatamente del bucle.
Una break
instrucción puede incluir una etiqueta que le permite salir de bucles incrustados. Una etiqueta puede especificar cualquier palabra clave de bucle, como foreach
, for
o while
, en un script.
En el ejemplo siguiente se muestra cómo usar una break
instrucción para salir de una for
instrucción:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
En este ejemplo, la break
instrucción sale del for
bucle cuando la $i
variable es igual a 1. Aunque la for
instrucción se evalúa como True hasta $i
que es mayor que 10, PowerShell alcanza la instrucción break la primera vez que se ejecuta el for
bucle.
Es más común usar la break
instrucción en un bucle donde se debe cumplir una condición interna. Considere el ejemplo de instrucción siguiente 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"
En este ejemplo, la foreach
instrucción itera la $varB
matriz. La if
instrucción se evalúa como False las dos primeras veces que se ejecuta el bucle y la variable $i
se incrementa en 1. La tercera vez que se ejecuta el bucle, $i
es igual a 2 y la $val
variable es igual a 30. En este punto, la break
instrucción se ejecuta y el foreach
bucle se cierra.
Uso de una etiqueta en break
un bucle
Una break
instrucción puede incluir una etiqueta. Si usa la break
palabra clave con una etiqueta, PowerShell sale del bucle etiquetado en lugar de salir del bucle actual.
La etiqueta es un signo de dos puntos seguido de un nombre que asigne. La etiqueta debe ser el primer token de una instrucción y debe ir seguido de la palabra clave de bucle, como while
.
break
mueve la ejecución fuera del bucle etiquetado. En los bucles incrustados, esto tiene un resultado diferente al de la break
palabra clave cuando se usa por sí mismo. Este ejemplo tiene una while
instrucción con una for
instrucción :
: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
Si la condición 2 se evalúa como True, la ejecución del script se omite a la instrucción después del bucle etiquetado. En el ejemplo, la ejecución se inicia de nuevo con la instrucción $a = $c
.
Puede anidar muchos bucles etiquetados, como se muestra en el ejemplo siguiente.
: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"
Si la variable se evalúa como True, la $b
ejecución del script se reanuda después del bucle con la etiqueta "rojo". Si la variable se evalúa como True, la $c
ejecución del control de script se reanuda después del bucle con la etiqueta "amarillo".
Si la variable se evalúa como True, la $a
ejecución se reanuda después del bucle más interno. No se necesita ninguna etiqueta.
PowerShell no limita hasta qué punto las etiquetas pueden reanudar la ejecución. La etiqueta puede incluso pasar el control a través de los límites de script y de llamada de función.
Uso break
en una switch
instrucción
En una switch
construcción, break
hace que PowerShell salga del bloque de switch
código.
La break
palabra clave se usa para dejar la switch
construcción. Por ejemplo, la siguiente switch
instrucción usa break
instrucciones para probar la condición más 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
}
}
En este ejemplo, la $var
variable se crea e inicializa en un valor de cadena de word2
. La switch
instrucción usa la clase Regex para que coincida primero con el valor de la variable con el término word2
. Dado que el valor de la variable y la primera prueba de la switch
instrucción coinciden, se ejecuta el primer bloque de código de la switch
instrucción.
Cuando PowerShell alcanza la primera break
instrucción, se cierra la switch
instrucción . Si se quitan las cuatro break
instrucciones del ejemplo, se cumplen las cuatro condiciones. En este ejemplo se usa la break
instrucción para mostrar los resultados cuando se cumple la condición más específica.
Uso break
en una trap
instrucción
Si la instrucción final ejecutada en el cuerpo de una trap
instrucción es break
, se suprime el objeto de error y se vuelve a producir la excepción.
En el ejemplo siguiente se crea una excepción DivideByZeroException que está atrapada mediante la trap
instrucción .
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 la ejecución se detiene en la excepción. Nunca After loop
se alcanza.
La excepción se vuelve a producir después de que se trap
ejecute .
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.
No use break
fuera de un bucle, switch
, o trap
Cuando break
se usa fuera de una construcción que lo admite directamente (bucles, switch
, trap
), PowerShell busca la pila de llamadas para una construcción envolvente. Si no encuentra una construcción envolvente, el espacio de ejecución actual finaliza silenciosamente.
Esto significa que las funciones y los scripts que usan accidentalmente un break
elemento fuera de una construcción envolvente que lo admite pueden terminar involuntariamente sus autores de llamadas.
El uso break
dentro de una canalización break
, como un ForEach-Object
bloque de script, no solo sale de la canalización, lo que podría terminar todo el espacio de ejecución.