Jika saya melakukan hal berikut dalam skrip PowerShell:
$range = 1..100
ForEach ($_ in $range) {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Saya mendapatkan hasil yang diharapkan dari:
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
Namun, jika saya menggunakan pipa dan ForEach-Object
, continue
tampaknya untuk keluar dari lingkaran pipa.
1..100 | ForEach-Object {
if ($_ % 7 -ne 0 ) { continue; }
Write-Host "$($_) is a multiple of 7"
}
Bisakah saya mendapatkan continue
perilaku -seperti saat masih melakukan ForEach-Object, jadi saya tidak perlu memutuskan pipeline saya?
powershell
foreach
Justin Dearing
sumber
sumber
foreach
: techotopia.com/index.php/…Jawaban:
Cukup gunakan sebagai
return
pengganticontinue
. Inireturn
kembali dari blok skrip yang dipanggil olehForEach-Object
pada iterasi tertentu, dengan demikian, ini mensimulasikancontinue
in a loop.Ada hal yang harus diingat saat melakukan refactoring. Kadang-kadang seseorang ingin mengubah
foreach
blok pernyataan menjadi pipa denganForEach-Object
cmdlet (bahkan memiliki aliasforeach
yang membantu membuat konversi ini mudah dan membuat kesalahan juga mudah). Semuacontinue
s harus diganti denganreturn
.PS: Sayangnya, hal ini tidak mudah untuk mensimulasikan
break
diForEach-Object
.sumber
continue
dapat digunakan untuk mensimulasikanbreak
dalamForEach-Object
:)continue
akan merusak seluruh naskah, tidak hanya diForEach-Object
mana itu digunakan.Karena
For-Each
objek adalah cmdlet dan tidak loop dancontinue
danbreak
tidak berlaku untuk itu.Misalnya, jika Anda memiliki:
Anda akan mendapatkan keluaran sebagai:
Itu karena
continue
akan diterapkan ke loop foreach luar dan bukan cmdlet foreach-object. Dengan tidak adanya lingkaran, tingkat terluar, sehingga memberi Anda kesan seperti itubreak
.Jadi, bagaimana Anda mendapatkan
continue
perilaku seperti? Salah satunya tentu saja Where-Object :sumber
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.
Apa maksudmu?Alternatif lain adalah semacam peretasan, tetapi Anda dapat membungkus blok Anda dalam satu lingkaran yang akan dieksekusi sekali. Dengan begitu,
continue
akan ada efek yang diinginkan:sumber
else
Pernyataan sederhana membuatnya berfungsi seperti di:Atau dalam satu pipa:
Namun solusi yang lebih elegan adalah membalik pengujian Anda dan menghasilkan output hanya untuk kesuksesan Anda
sumber