Búsqueda de sitios web

Interrupción de PowerShell para cada bucle


Por lo general, los estudiantes se confunden con ForEach y ForEach-Object cuando usan declaraciones break/continue en PowerShell, pero hay Hay una clara diferencia entre el bucle ForEach y el cmdlet ForEach-Object, por eso las instrucciones break/continue no funcionan en el cmdlet ForEach-Object del mismo modo que funcionan en el bucle ForEach.

Aprenderemos sobre ambas declaraciones en este artículo, pero antes de profundizar en los detalles, es obligatorio tener en cuenta que ambas declaraciones (break/continue) se utilizan para alterar el flujo de el bucle, pero hay una diferencia entre ellos.

La instrucción break sale inmediatamente del bucle, independientemente de si se ha cumplido la condición especificada. Significa que se omitirán todas las iteraciones restantes de un bucle y la ejecución comenzará desde la declaración que sigue inmediatamente al bucle.

Por otro lado, la instrucción continue no sale del bucle, sino que omite la iteración actual del bucle y pasa a la siguiente iteración. Significa que cualquier código que siga a la instrucción continue dentro de la iteración actual del bucle se omite, pero el bucle en sí continúa ejecutándose en la siguiente iteración.

Aprendamos con los ejemplos de código a continuación.

Uso de declaraciones break/continue en el bucle ForEach

Utilice la instrucción break en el bucle ForEach en PowerShell.

Utilice la instrucción Break en ForEach Loop:

$range = 1..10
ForEach ($number in $range) {
    if ($number -eq 5){
        break
    }
    Write-Host $number
}
Write-Host "I am out of ForEach now."

PRODUCCIÓN :

1
2
3
4
I am out of ForEach now.

Primero, usamos el operador .. para crear un rango de números basado en el límite superior e inferior dado y lo almacenamos en la variable $range. A continuación, utilizamos el bucle ForEach para iterar sobre el $range.

Finalmente, utilizamos la instrucción if con el operador -eq en cada iteración para verificar si el número actual (representado con $number) es igual a < código>5. Si es así, salga del bucle utilizando la instrucción break; de lo contrario, imprima el número utilizando el cmdlet Write-Host. Finalmente, usamos otro Write-Host fuera de ForEach para mostrar cuándo salimos del bucle.

El código anterior salió del bucle ForEach cuando $number era igual a 5. Como resultado, el cmdlet Write-Host que sigue a la instrucción break no se ejecutaría.

Utilice la instrucción continue en el bucle ForEach en PowerShell.

Utilice la instrucción Continuar en ForEach Loop:

$range = 1..10
foreach ($number in $range) {
    if ($number -eq 5){
        continue
    }
    Write-Host $number
}
Write-Host "I am out of ForEach now."

PRODUCCIÓN :

1
2
3
4
6
7
8
9
10
I am out of ForEach now.

Este ejemplo es el mismo que el anterior, pero esta vez usamos la instrucción continue. Cuando se cumple la instrucción if, la instrucción continue omite la iteración actual y salta a la siguiente. Tenga en cuenta que cualquier instrucción que siga a la instrucción continue no se ejecutará.

Utilice las instrucciones break y continue en el bucle ForEach de PowerShell.

Utilice instrucciones Break/Continue en ForEach Loop:

$range = 1..10
foreach ($number in $range) {
    if ($number -eq 5){
        continue
    }elseif($number -eq 9){
       break
    }
    Write-Host $number
}
Write-Host "I am out of ForEach now."

PRODUCCIÓN :

1
2
3
4
6
7
8
I am out of ForEach now.

Este ejemplo es la combinación de los dos últimos ejemplos de código. Se saltó la iteración en el número 5 y continuó con las iteraciones posteriores, pero salió del ciclo cuando el número era 9.

El break también se puede usar dentro del conmutador y la captura en PowerShell.

Agreguemos un giro a los ejemplos anteriores. Supongamos una situación en la que estás utilizando el bucle ForEach dentro del bucle while. Ahora tiene dos matrices, cada una de las cuales contiene valores enteros. El bucle while itera sobre array1. Por otro lado, ForEach itera sobre array2 para cada iteración del bucle while. Utilice la declaración break dentro de ForEach según la declaración if especificada.

El punto que vale la pena señalar es que la declaración break romperá el bucle ForEach tan pronto como se cumpla la declaración if, pero su trabajo es romper ForEach y while ambos bucles utilizan una instrucción break que seguramente utilizará dentro de ForEach. ¿Cómo hacerlo? Aprendamoslo en el siguiente ejemplo.

Utilice la instrucción break etiquetada en el bucle ForEach

Para usar la etiqueta break en ForEach en PowerShell:

  • Cree dos matrices que contengan valores enteros y guárdelas en variables separadas.
  • Utilice while para iterar sobre la primera matriz.
  • Para cada iteración del bucle while :

    • Utilice ForEach para iterar sobre la segunda matriz.
    • Utilice la instrucción if con el operador -eq para determinar si un número actual de la segunda matriz es igual a 8.
    • Si es así, rompa los bucles ForEach y while; de lo contrario, imprima el número y pase a la siguiente iteración.
  • Usamos dos cmdlets Write-Host para demostrar cuándo dejamos los bucles ForEach y while.

Utilice la declaración de interrupción etiquetada en ForEach Loop:

$array1 = @(1,2,3,4)
$array2 = @(5,6,7,8,9)
$i=0
:breakAll while($i -lt $array1.length){
    ForEach ($number in $array2) {
        if ($number -eq 8){
            break breakAll
        }
        Write-Host $number
    }
    $i++
    Write-Host "I am out of ForEach now."
}
Write-Host "I am out of While now."

PRODUCCIÓN :

5
6
7
I am out of While now.

Aquí, utilizamos una instrucción break etiquetada, que sale del bucle etiquetado en lugar de dejar el bucle actual en PowerShell.

Uso de declaraciones break/continue/return en el cmdlet ForEach-Object

Utilice la instrucción break en el cmdlet ForEach-Object en PowerShell.

Utilice la instrucción Break en el cmdlet ForEach-Object:

$range = 1..10
$range | ForEach-Object {
    if ($_ -eq 5){
        break
    }
    Write-Host $_
}
Write-Host "I am out of ForEach_Object now."

PRODUCCIÓN :

1
2
3
4

Esperábamos que la instrucción break saliera de ForEach-Object en el número 5 y ejecutara Write-Host fuera del ForEach-Object para imprimir el mensaje Ya no tengo ForEach_Object., pero canceló todo el script en el número 5.

Utilice la instrucción continue en el cmdlet ForEach-Object en PowerShell.

Utilice la instrucción Continuar en el cmdlet ForEach-Object:

$range = 1..10
$range | ForEach-Object {
    if ($_ -eq 5){
        continue
    }
    Write-Host $_
}
Write-Host "I am out of ForEach_Object now."

PRODUCCIÓN :

1
2
3
4

La instrucción continue tampoco funcionó como debería. En lugar de omitir la iteración en el número 5 y continuar con las siguientes iteraciones, canceló el script en el número 5 y no imprimió el Ya no tengo ForEach_Object. . mensaje.

Entonces, los dos ejemplos anteriores demostraron que las declaraciones break y continue no se pueden usar para alterar el flujo de ForEach-Object; necesitamos usar la declaración return; vea el siguiente ejemplo.

Utilice la instrucción return en el cmdlet ForEach-Object en PowerShell.

Utilice la declaración de devolución en el cmdlet ForEach-Object:

$range = 1..10
$range | ForEach-Object {
    if ($_ -eq 5){
        return
    }
    Write-Host $_
}
Write-Host "I am out of ForEach_Object now."

PRODUCCIÓN :

1
2
3
4
6
7
8
9
10
I am out of ForEach_Object now.

Mira, el return se saltó la iteración en el número 5 y continuó con las siguientes iteraciones. Recuerde, usar la instrucción return dentro del bucle ForEach romperá todo el script como lo hicieron las declaraciones break y continue con ParaCada-Objeto.

Se trata de que PowerShell rompa el bucle ForEach.

Artículos relacionados