Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Descripción breve
Describe la instrucción break, que proporciona una manera de salir del bloque de control actual.
Descripción larga
La instrucción break 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 en bucles
Cuando aparece una instrucción break en un bucle, como foreach, for, doo while, PowerShell sale inmediatamente del bucle.
Una instrucción break puede incluir una etiqueta que le permita salir de bucles incrustados. Una etiqueta puede especificar cualquier palabra clave de bucle, como foreach, foro while, en un script.
En el ejemplo siguiente se muestra cómo usar una instrucción break para salir de una instrucción for:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
En este ejemplo, la instrucción break sale del bucle for cuando la variable $i es igual a 1. Aunque la instrucción for da como resultado True hasta que $i sea mayor que 10, PowerShell llega a la instrucción break la primera vez que se ejecuta el bucle for.
Es más común usar la instrucción break en un bucle donde se debe cumplir una condición interna. Por ejemplo, considere la siguiente instrucción 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 instrucción foreach recorre en iteración la matriz $varB. La instrucción if 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 variable $val es igual a 30. En este momento, se ejecuta la instrucción break y se cierra el bucle foreach.
Uso de un break etiquetado en un bucle
Una instrucción break puede incluir una etiqueta. Si usa la palabra clave break 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 declaración y debe ir seguida de la palabra clave de bucle, como while.
break mueve la ejecución fuera del bucle etiquetado. En bucles incrustados, esto tiene un resultado diferente al de la palabra clave break cuando se usa por sí mismo. Este ejemplo tiene una instrucción while con una instrucción 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
Si la condición 2 se evalúa como True, la ejecución del script pasa directamente 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 $b se evalúa como True, la ejecución del script se reanuda después del bucle con la etiqueta "rojo". Si la variable $c se evalúa como True, la ejecución del control de script se reanuda después del bucle con la etiqueta "amarillo".
Si la variable $a se evalúa como True, la 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 de break en una instrucción switch.
En una construcción de switch, break hace que PowerShell salga del bloque de código switch.
La palabra clave break se usa para salir de la construcción switch. Por ejemplo, la siguiente instrucción switch usa instrucciones break 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 variable $var se crea e inicializa en un valor de cadena de word2. La instrucción switch usa la clase Regex para cotejar el valor de la variable primero con el término word2. Dado que el valor de la variable y la primera prueba de la instrucción switch coinciden, se ejecuta el primer bloque de código de la instrucción switch.
Cuando PowerShell alcanza la primera instrucción break, la ejecución de la instrucción switch finaliza. Si se quitan las cuatro instrucciones break del ejemplo, se cumplen las cuatro condiciones. En este ejemplo se usa la instrucción break para mostrar los resultados cuando se cumple la condición más específica.
Uso de break en una instrucción trap.
Si la instrucción final ejecutada en el cuerpo de una instrucción trap es break, se suprime el objeto de error y se relanza la excepción.
En el ejemplo siguiente se crea una excepción DivideByZeroException que se intercepta mediante la instrucción 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 la ejecución se detiene en la excepción. Nunca se alcanza After loop.
La excepción vuelve a lanzarse después de que se ejecute 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.
No use break fuera de un bucle, switcho 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 entre llaves, el espacio de ejecución actual finaliza de manera silenciosa.
Esto significa que las funciones y scripts que utilizan involuntariamente un break fuera de una construcción entre llaves que lo admite, pueden terminar involuntariamente sus autores de llamada.
El uso de break dentro de una canalización break, como un bloque de script ForEach-Object, no solo sale de la canalización, sino que posiblemente finaliza todo el espacio de ejecución.