Se eu fizer o seguinte em um script do PowerShell:
$range = 1..100
ForEach ($_ in $range) {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Eu recebo a saída esperada 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
No entanto, se eu usar um pipeline e ForEach-Object
, continue
parece romper o loop do pipeline.
1..100 | ForEach-Object {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Posso ter um continue
comportamento semelhante enquanto ainda faço o ForEach-Object, para não precisar interromper meu pipeline?
powershell
foreach
Justin Dearing
fonte
fonte
foreach
: techotopia.com/index.php/...Respostas:
Basta usar o em
return
vez docontinue
. Issoreturn
retorna do bloco de script que é chamado porForEach-Object
uma iteração específica e, portanto, simula ocontinue
loop.Há uma pegadinha a ser lembrada ao refatorar. Às vezes, alguém deseja converter um
foreach
bloco de instruções em um pipeline com umForEach-Object
cmdlet (ele ainda possui o aliasforeach
que ajuda a facilitar essa conversão e também a cometer erros). Todos oscontinue
s devem ser substituídos porreturn
.PS: Infelizmente, não é assim tão fácil de simular
break
emForEach-Object
.fonte
continue
pode ser usado para simular umbreak
emForEach-Object
:)continue
vai quebrar todo o script, não apenasForEach-Object
onde é usado.Porque
For-Each
objeto é um cmdlet e não um loop econtinue
ebreak
não se aplicam a ele.Por exemplo, se você tiver:
Você obterá a saída como:
Isso ocorre porque
continue
é aplicado ao loop foreach externo e não ao cmdlet foreach-object. Na ausência de um loop, o nível mais externo, dando a você uma impressão de que ele age como essebreak
.Então, como você consegue um
continue
comportamento semelhante? Uma maneira é o Where-Object, é claro:fonte
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.
Como assim?Outra alternativa é uma espécie de hack, mas você pode agrupar seu bloco em um loop que será executado uma vez. Dessa forma,
continue
terá o efeito desejado:fonte
Uma
else
declaração simples faz com que funcione como em:Ou em um único pipeline:
Mas uma solução mais elegante é inverter seu teste e gerar resultados apenas para seus sucessos
fonte