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
, continue
parece 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 continue
comportamiento 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
return
lugar delcontinue
. Estoreturn
regresa del bloque de script que es invocado porForEach-Object
en una iteración particular, por lo tanto, simula elcontinue
en un bucle.Hay un problema que debe tenerse en cuenta al refactorizar. A veces, uno quiere convertir un
foreach
bloque de declaración en una canalización con unForEach-Object
cmdlet (incluso tiene el aliasforeach
que ayuda a facilitar esta conversión y a cometer errores también). Todos loscontinue
s deben reemplazarse porreturn
.PD: Por desgracia, no es tan fácil de simular
break
enForEach-Object
.fuente
continue
puede ser utilizado para simular unabreak
enForEach-Object
:)continue
romperá todo el guión, no soloForEach-Object
donde se usa.Porque el
For-Each
objeto es un cmdlet y no un buclecontinue
ybreak
no se aplica a él.Por ejemplo, si tiene:
Obtendrá la salida como:
Se debe a que
continue
se 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
continue
comportamiento 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,
continue
tendrá el efecto deseado:fuente
Una
else
declaració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