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 foreachbucle , for, doo 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, foro 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 switchconstrucció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.

Consulte también