トピック about_Break 簡易説明 Foreach、For、While、Do、または Switch ステートメントを直ちに終了するために使用できる ステートメントについて説明します。 詳細説明 Break ステートメントが Foreach、For、Switch、While ループなどのループ内に出現した場 合、Break ステートメントはそのループを直ちに終了するように Windows PowerShell に指示しま す。ループしない Switch 構文では、Break は Switch コード ブロックを終了するように Windows PowerShell に指示します。 Break ステートメントには、埋め込みループを終了するためのラベルが含めることができます。ラベ ルには、スクリプトにある Foreach、For、While などのループ キーワードを指定できます。ラベ ルが使用されている場合、Break が出現すると、指定されたループが終了します。Break が出現する と、どのループに Break ステートメントが含まれているにかかわらず、指定されたループが終了します。 次の例は、Break ステートメントを使用して For ステートメントを終了する方法を示しています。 for($i=1; $i -le 10; $i++) { Write-Host $i break } この例では、$i 変数が 1 に等しい状態で、Break ステートメントによって For ループが終了しま す。For ステートメントは $i が 10 より大きくなるまで True として評価されますが、Windows PowerShell は、最初に For ループが実行されたときに Break ステートメントに到達します。 Break ステートメントは、内部条件が満たされる必要があるループ内で使用される方がより一般的で す。次のような Foreach ステートメントの例を考えてみます。 $i=0 $varB = 10,20,30,40 foreach ($val in $varB) { $i++ if ($val -eq 30) { break } } Write-Host "30 was found in array position $i" この例では、Foreach ステートメントが $varB 配列の要素に対して繰り返し実行されます。コード ブロックが実行されるたびに、$i 変数は 1 ずつインクリメントされます。最初の 2 回に実行される ループでは、If ステートメントは False に評価されます。3 回目に実行されるループで、$i は 3 に 等しくなり、$val 変数は 30 に等しくなります。この時点で Break ステートメントが実行され、 Foreach ループが終了します。 その他のループ ステートメントを Break によって終了する方法も、Foreach ループの場合と同じで す。次の例では、DivideByZeroException 例外が Trap ステートメントによってトラップされた場合 に、Break ステートメントによって While ステートメントが終了します。 $i = 3 while ($true) { trap [DivideByZeroException] { Write-Host "divide by zero trapped" break } 1 / $i-- } Break ステートメントには、ラベルを含めることができます。Break キーワードをラベルと共に使用 すると、Windows PowerShell では、現在のループの代わりにラベル付けしているループが終了します。 ラベルの構文は次のとおりです (この例では、While ループのラベルを示します)。 :myLabel while (<condition>) { <statement list>} ラベルはコロンの後に割り当てる名前を指定したものです。ラベルはステートメントの最初のトーク ンであり、直後に While などのループ キーワードを記述する必要があります。 Windows PowerShell では、Foreach、For、While などのループ キーワードのみにラベルを使用で きます。 Break は、ラベル付けしたループの外に制御を移動します。埋め込みループの場合、Break キーワー ドを単独で使用した場合とは異なる結果になります。ここでは、While ステートメントと For ステー トメントを使用した例を示します。 :myLabel while (<condition 1>) { for ($item in $items) { if (<condition 2>) { break myLabel } $item = $x # For ループ内のステートメント } } $a = $c # ラベル付けした While ループの後のステートメント condition 2 が True と評価された場合、スクリプトの実行はラベル付けしたループの後のステートメン トに移されます。この例では、"$a = $c" のステートメントで実行が再開されます。 次の例に示すように、ラベル付けしたループはいくつでも入れ子にできます。 :red while (<condition1>) { :yellow while (<condition2>) { while (<condition3>) { if ($a) {break} if ($b) {break red} if ($c) {break yellow} } # 最も内側のループの後 } # "yellow" ループの後 } # "red" ループの後 $b 変数が True と評価された場合、スクリプトの実行は、"red" とラベル付けしたループの後から再開 されます。$c 変数が True と評価された場合、スクリプトの実行制御は、"yellow" とラベル付けしたル ープの後から再開されます。 $a 変数が True と評価された場合、実行は最も内側のループの後から再開されます。ラベルは必要あり ません。 Windows PowerShell では、ラベルの位置に関係なく実行を再開できます。ラベルを使用すると、スク リプトや関数呼び出しの境界を超えて制御を渡すことができます。 Break キーワードは、Switch 構文の外に制御を移すために使用します。たとえば、次の Switch ステ ートメントは Break ステートメントを使用して、最も細かい条件をテストしています。 $var = "word2" switch -regex ($var) { "word2" { Write-Host "Exact" $_ break } "word.*" { Write-Host "Match on the prefix" $_ break } "w.*" { Write-Host "Match on at least the first letter" $_ break } default { Write-Host "No match" $_ break } } この例では、$var 変数が作成されて文字列値 "word2" に初期化されます。Switch ステートメントは Regex クラスを使用して、変数の値を文字列 "word2" と最初に比較します (Regax クラスは、 Microsoft .NET Framework の正規表現クラスです)。変数の値と Switch ステートメントの最初のテスト は一致するため、Switch ステートメントの最初のコード ブロックが実行されます。 Windows PowerShell が最初の Break ステートメントに到達すると、Switch ステートメントは終了しま す。この例から 4 つの Break ステートメントを取り除いた場合、4 つの条件すべてが満たされます。 この例では、Break ステートメントを使用して最も細かい条件が満たされた場合に結果を表示していま す。 関連項目 about_Comparison_Operators about_For about_Foreach about_Switch about_While