Wenn ich in einem PowerShell-Skript Folgendes mache:
$range = 1..100
ForEach ($_ in $range) {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Ich erhalte die erwartete Ausgabe von:
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
Wenn ich jedoch eine Pipeline verwenden ForEach-Object
, continue
scheint der Pipeline - Schleife auszubrechen.
1..100 | ForEach-Object {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Kann ich ein continue
ähnliches Verhalten erzielen, während ich noch ForEach-Object ausführe, damit ich meine Pipeline nicht auflösen muss?
powershell
foreach
Justin Dearing
quelle
quelle
foreach
: techotopia.com/index.php/…Antworten:
Verwenden Sie einfach die
return
anstelle dercontinue
. Diesreturn
kehrt von dem Skriptblock zurück, derForEach-Object
bei einer bestimmten Iteration aufgerufen wird , und simuliert somit dascontinue
in einer Schleife.Beim Refactoring ist ein Gotcha zu beachten. Manchmal möchte man einen
foreach
Anweisungsblock mit einemForEach-Object
Cmdlet in eine Pipeline konvertieren (es hat sogar den Aliasforeach
, der diese Konvertierung vereinfacht und auch Fehler erleichtert). Allecontinue
s sollten durch ersetzt werdenreturn
.PS: Leider ist es nicht so einfach zu simulieren
break
inForEach-Object
.quelle
continue
kann anscheinend einbreak
In simuliert werdenForEach-Object
:)continue
Wille bricht das ganze Skript, nicht nurForEach-Object
wo es verwendet wird.Da
For-Each
Objekt ein Cmdlets und keine Schleife undcontinue
undbreak
gelten nicht für sie.Zum Beispiel, wenn Sie haben:
Sie erhalten folgende Ausgabe:
continue
Dies liegt daran, dass das auf die äußere foreach-Schleife und nicht auf das Cmdlet foreach-object angewendet wird. In Abwesenheit einer Schleife die äußerste Ebene, wodurch Sie einen Eindruck davon bekommen, wie sie sich verhältbreak
.Wie kommt man zu einem
continue
ähnlichen Verhalten? Ein Weg ist natürlich Where-Object :quelle
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.
Was meinst du?Eine andere Alternative ist eine Art Hack, aber Sie können Ihren Block in eine Schleife einschließen, die einmal ausgeführt wird. Auf diese Weise
continue
wird der gewünschte Effekt erzielt:quelle
Eine einfache
else
Aussage macht es wie folgt:Oder in einer einzigen Pipeline:
Eine elegantere Lösung besteht jedoch darin, Ihren Test umzukehren und nur für Ihre Erfolge eine Ausgabe zu generieren
quelle