Si je fais ce qui suit dans un script PowerShell:
$range = 1..100
ForEach ($_ in $range) {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
J'obtiens la sortie attendue 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
Cependant, si j'utilise un pipeline et ForEach-Object
, continue
semble sortir de la boucle du pipeline.
1..100 | ForEach-Object {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Puis-je avoir un continue
comportement de type-like tout en faisant ForEach-Object, pour ne pas avoir à interrompre mon pipeline?
powershell
foreach
Justin Dearing
la source
la source
foreach
: techotopia.com/index.php/…Réponses:
Utilisez simplement le
return
au lieu ducontinue
. Celareturn
revient du bloc de script qui est appelé parForEach-Object
sur une itération particulière, ainsi, il simule lecontinue
dans une boucle.Il y a un piège à garder à l'esprit lors de la refactorisation. Parfois, on veut convertir un
foreach
bloc d'instructions en pipeline avec uneForEach-Object
applet de commande (il a même l'aliasforeach
qui aide à rendre cette conversion facile et à faire des erreurs aussi). Tous lescontinue
s doivent être remplacés parreturn
.PS: Malheureusement, il est facile de simuler
break
enForEach-Object
.la source
continue
peut apparemment être utilisé pour simuler unbreak
inForEach-Object
:)continue
cassera tout le script, pas seulementForEach-Object
là où il est utilisé.Parce que l'
For-Each
objet est une applet de commande et non une boucle etcontinue
etbreak
ne s'y applique pas.Par exemple, si vous avez:
Vous obtiendrez la sortie comme:
C'est parce que le
continue
est appliqué à la boucle foreach externe et non à l'applet de commande foreach-object. En l'absence de boucle, le niveau le plus extérieur, vous donnant ainsi une impression d'agir commebreak
.Alors, comment obtenez-vous un
continue
comportement semblable? Un moyen est bien sûr Where-Object :la source
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.
Que voulez-vous dire?Une autre alternative est une sorte de hack, mais vous pouvez envelopper votre bloc dans une boucle qui s'exécutera une fois. De cette façon,
continue
aura l'effet souhaité:la source
Une simple
else
déclaration le fait fonctionner comme dans:Ou en un seul pipeline:
Mais une solution plus élégante consiste à inverser votre test et à générer une sortie uniquement pour vos succès
la source