1. ホーム
  2. powershell

[解決済み] Foreach-Objectで'continue'が'break'のように動作するのはなぜですか?

2022-05-28 14:35:37

質問

PowerShellスクリプトで以下を実行すると。

$range = 1..100
ForEach ($_ in $range) {
    if ($_ % 7 -ne 0 ) { continue; }
    Write-Host "$($_) is a multiple of 7"
}

という期待通りの出力が得られます。

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

しかし、パイプラインを使用し ForEach-Object , continue はパイプラインのループから抜け出すようです。

1..100 | ForEach-Object {
    if ($_ % 7 -ne 0 ) { continue; }
    Write-Host "$($_) is a multiple of 7"
}

を取得することはできますか? continue -のような動作をさせながら、ForEach-Objectを行うことは可能でしょうか?

どのように解決するのですか?

単純に return の代わりに continue . これは return が呼び出されるスクリプトブロックから返されます。 ForEach-Object によって呼び出されるスクリプトブロックから返されます。 continue をループでシミュレートします。

1..100 | ForEach-Object {
    if ($_ % 7 -ne 0 ) { return }
    Write-Host "$($_) is a multiple of 7"
}

リファクタリングの際に気をつけなければならないことがあります。時には foreach ステートメントブロックをパイプラインに変換して ForEach-Object コマンドレット (これは別名 foreach という別名もあり、この変換を簡単にし、ミスも簡単にするのに役立ちます)。すべて continue に置き換える必要があります。 return .

追記: 残念ながら breakForEach-Object .