Si hago lo siguiente en un script de PowerShell:
$range = 1..100
ForEach ($_ in $range) {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Obtengo el resultado esperado de:
7 is a multiple of 7
14 is a multiple of 7
21 is a multiple of 7
28 is a multiple of 7
35 is a multiple of 7
42 is a multiple of 7
49 is a multiple of 7
56 is a multiple of 7
63 is a multiple of 7
70 is a multiple of 7
77 is a multiple of 7
84 is a multiple of 7
91 is a multiple of 7
98 is a multiple of 7
Sin embargo, si uso una tubería y ForEach-Object, continueparece romper el bucle de tubería.
1..100 | ForEach-Object {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
¿Puedo tener un continuecomportamiento similar mientras sigo haciendo ForEach-Object, para no tener que romper mi canalización?
powershell
foreach
Justin Dearing
fuente
fuente

foreach: techotopia.com/index.php/…Respuestas:
Simplemente use el en
returnlugar delcontinue. Estoreturnregresa del bloque de script que es invocado porForEach-Objecten una iteración particular, por lo tanto, simula elcontinueen un bucle.Hay un problema que debe tenerse en cuenta al refactorizar. A veces, uno quiere convertir un
foreachbloque de declaración en una canalización con unForEach-Objectcmdlet (incluso tiene el aliasforeachque ayuda a facilitar esta conversión y a cometer errores también). Todos loscontinues deben reemplazarse porreturn.PD: Por desgracia, no es tan fácil de simular
breakenForEach-Object.fuente
continuepuede ser utilizado para simular unabreakenForEach-Object:)continueromperá todo el guión, no soloForEach-Objectdonde se usa.Porque el
For-Eachobjeto es un cmdlet y no un buclecontinueybreakno se aplica a él.Por ejemplo, si tiene:
Obtendrá la salida como:
Se debe a que
continuese aplica al bucle foreach externo y no al cmdlet foreach-object. En ausencia de un bucle, el nivel más externo, lo que le da una impresión de que actúa comobreak.Entonces, ¿cómo se obtiene un
continuecomportamiento similar? Una forma es Where-Object, por supuesto:fuente
In my actual case, I don't think it makes sense to make the multiple lines of code preceding my if statement into a single long line of hard to read code.¿Qué quieres decir?Otra alternativa es una especie de truco, pero puedes envolver tu bloque en un bucle que se ejecutará una vez. De esa forma,
continuetendrá el efecto deseado:fuente
Una
elsedeclaración simple hace que funcione como en:O en una sola tubería:
Pero una solución más elegante es invertir su prueba y generar resultados solo para sus éxitos
fuente