Jeśli wykonam następujące czynności w skrypcie PowerShell:
$range = 1..100
ForEach ($_ in $range) {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Otrzymuję oczekiwany wynik:
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
Jeśli jednak używam rurociągu i ForEach-Object
, continue
wydaje się , że wyłamuje się z pętli rurociągu.
1..100 | ForEach-Object {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Czy mogę uzyskać continue
podobne zachowanie, nadal wykonując ForEach-Object, więc nie muszę przerywać mojego potoku?
powershell
foreach
Justin Dearing
źródło
źródło
foreach
: techotopia.com/index.php/ ...Odpowiedzi:
Po prostu użyj
return
zamiastcontinue
. Tereturn
powroty z bloku skryptu który powoływałaForEach-Object
się na danej iteracji, tym samym, że symulujecontinue
w pętli.Podczas refaktoryzacji należy mieć na uwadze pewien problem. Czasami ktoś chce przekonwertować
foreach
blok instrukcji na potok za pomocą poleceniaForEach-Object
cmdlet (ma nawet alias,foreach
który ułatwia tę konwersję i ułatwia popełnienie błędów). Wszystkiecontinue
znaki należy zastąpićreturn
.PS: Niestety, nie jest to łatwe do symulacji
break
wForEach-Object
.źródło
continue
można go użyć do symulacjibreak
wForEach-Object
:)continue
cały skrypt, nie tylkoForEach-Object
tam, gdzie jest używany.Ponieważ
For-Each
obiekt jest cmdletem, a nie pętlącontinue
ibreak
nie ma do niego zastosowania.Na przykład, jeśli masz:
Otrzymasz dane wyjściowe jako:
Dzieje się tak, ponieważ
continue
zostaje zastosowany do zewnętrznej pętli foreach, a nie do polecenia cmdlet foreach-object. W przypadku braku pętli, najbardziej zewnętrznego poziomu, co daje wrażenie, że zachowuje się jakbreak
.Jak więc uzyskać
continue
podobne zachowanie? Jednym ze sposobów jest oczywiście Where-Object :źródło
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.
Co masz na myśli?Inną alternatywą jest rodzaj hackowania, ale możesz zawinąć swój blok w pętlę, która zostanie wykonana raz. W ten sposób
continue
przyniesie pożądany efekt:źródło
Proste
else
stwierdzenie sprawia, że działa jak w:Lub w pojedynczym rurociągu:
Ale bardziej eleganckim rozwiązaniem jest odwrócenie testu i wygenerowanie wyniku tylko dla twoich sukcesów
źródło