Saltar al contenido

Cómo salir de ForEach-Object en PowerShell

Estrella, miembro de nuestro equipo, nos ha hecho el favor de escribir esta sección porque conoce muy bien dicho tema.

Solución:

Objeto 1. Poniendo un break dentro de foreach loop sale del bucle, pero no detiene la canalización. Parece que quieres algo como esto:

$todo=$project.PropertyGroup 
foreach ($thing in $todo)
    if ($thing -eq 'some_condition')
        break
    

Artículo #2. PowerShell le permite modificar un array dentro de una foreach bucle sobre eso array, pero esos cambios no surten efecto hasta que salga del bucle. Intente ejecutar el siguiente código para ver un ejemplo.

$a=1,2,3
foreach ($value in $a)
  Write-Host $value

Write-Host $a

No puedo comentar por qué los autores de PowerShell permitieron esto, pero la mayoría de los otros lenguajes de secuencias de comandos (Perl, Python y shell) permiten construcciones similares.

Hay diferencias entre foreach y foreach-object.

Una muy buena descripción que puede encontrar aquí: MS-ScriptingGuy

Para probar en PS, aquí tienes scripts para mostrar la diferencia.

Para cada objeto:

# Omit 5.
1..10 | ForEach-Object 
if ($_ -eq 5) return
# if ($_ -ge 5) return # Omit from 5.
Write-Host $_

write-host "after1"
# Cancels whole script at 15, "after2" not printed.
11..20 | ForEach-Object 
if ($_ -eq 15) continue
Write-Host $_

write-host "after2"
# Cancels whole script at 25, "after3" not printed.
21..30 | ForEach-Object 
if ($_ -eq 25) break
Write-Host $_

write-host "after3"

para cada

# Ends foreach at 5.
foreach ($number1 in (1..10)) 
if ($number1 -eq 5) break
Write-Host "$number1"

write-host "after1"
# Omit 15. 
foreach ($number2 in (11..20)) 
if ($number2 -eq 15) continue
Write-Host "$number2"

write-host "after2"
# Cancels whole script at 25, "after3" not printed.
foreach ($number3 in (21..30)) 
if ($number3 -eq 25) return
Write-Host "$number3"

write-host "after3"

Para detener la tubería de la cual ForEach-Object es parte solo usa la declaración continue dentro del bloque de script debajo ForEach-Object. continue se comporta de manera diferente cuando lo usas en foreach(...) ... y en ForEach-Object ... y es por eso que es posible. Si desea continuar produciendo objetos en la tubería descartando algunos de los objetos originales, entonces la mejor manera de hacerlo es filtrar usando Where-Object.

No se te olvide mostrar este enunciado si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *