ja-JP/about_Break.help.txt

TOPIC
    about_Break

簡単な説明
    foreach、for、while、do、switch、trap の各ステートメントを直ちに抜ける
    break ステートメントについて説明します。

詳細な説明
    break ステートメントは、現在の制御ブロックを抜ける方法を提供します。
    制御ブロックの後ろにある次のステートメントから実行が続行されます。
    break はラベルをサポートします。ラベルとは、スクリプト内のステートメント
    に割り当てる名前のことです。

    ループでの break の使用

    break ステートメントが foreach、for、do、while などのループ内に現れると、
    PowerShell は直ちにそのループを抜けます。

    break ステートメントにはラベルを付けることができ、入れ子になったループを
    抜けられます。ラベルは、スクリプト内の foreach、for、while などの任意の
    ループキーワードを指定できます。

    次の例は、break ステートメントで for ステートメントを抜ける方法を示します。

        for($i=1; $i -le 10; $i++) {
           Write-Host $i
           break
        }

    この例では、$i 変数が 1 のときに break ステートメントが for ループを
    抜けます。for ステートメントは $i が 10 を超えるまで True と評価されますが、
    PowerShell は for ループが最初に実行された時点で break ステートメントに
    到達します。

    より一般的には、内側の条件が満たされたときに break を使います。次の
    foreach ステートメントの例を考えてみます。

        $i=0
        $varB = 10,20,30,40
        foreach ($val in $varB) {
          if ($val -eq 30) {
            break
          }
          $i++
        }
        Write-Host "30 was found in array index $i"

    この例では、foreach ステートメントが $varB 配列を反復処理します。最初の
    2 回は if ステートメントが False と評価され、変数 $i が 1 ずつ増加します。
    3 回目の実行時に $i は 2 となり、$val 変数は 30 になります。この時点で
    break ステートメントが実行され、foreach ループが終了します。

    ループでのラベル付き break の使用

    break ステートメントにはラベルを含められます。break キーワードをラベル
    付きで使うと、PowerShell は現在のループではなく、ラベルの付いたループを
    抜けます。ラベルはコロンに続けて割り当てる名前です。ラベルはステートメント
    内の最初のトークンでなければならず、その後に while などのループキーワードが
    続く必要があります。

    break はラベルの付いたループの外へ実行を移します。入れ子になったループでは、
    break キーワードを単独で使った場合とは異なる結果になります。次の例は、
    for ステートメントを含む while ステートメントです。

        :myLabel while (<condition 1>) {
          foreach ($item in $items) {
            if (<condition 2>) {
              break myLabel
            }
            $item = $x # A statement inside the For-loop
          }
        }
        $a = $c # A statement after the labeled While-loop

    condition 2 が True と評価されると、スクリプトの実行はラベルの付いた
    ループの後ろのステートメントまで飛びます。この例では、$a = $c という
    ステートメントから実行が再び始まります。

    次の例のように、ラベルの付いたループは多数入れ子にできます。

        :red while (<condition1>) {
          :yellow while (<condition2>) {
            while (<condition3>) {
              if ($a) {break}
              if ($b) {break red}
              if ($c) {break yellow}
            }
            Write-Host "After innermost loop"
          }
          Write-Host "After yellow loop"
        }
        Write-Host "After red loop"

    $b 変数が True と評価されると、"red" のラベルが付いたループの後ろから
    スクリプトの実行が再開されます。$c 変数が True と評価されると、"yellow"
    のラベルが付いたループの後ろからスクリプトの制御が再開されます。

    $a 変数が True と評価されると、最も内側のループの後ろから実行が再開されます。
    ラベルは不要です。

    PowerShell では、ラベルが実行を再開できる範囲に制限はありません。ラベルは
    スクリプトや関数の呼び出し境界を越えて制御を渡すこともできます。

    switch ステートメントでの break の使用

    switch 構文では、break によって PowerShell は switch コードブロックを
    抜けます。

    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 という語と
    照合します。変数の値と switch ステートメントの最初のテストが一致するため、
    switch ステートメントの最初のコードブロックが実行されます。

    PowerShell が最初の break ステートメントに到達すると、switch ステートメント
    を抜けます。この例から 4 つの break ステートメントを取り除くと、4 つの条件
    すべてが満たされます。この例では、最も具体的な条件が満たされたときに結果を
    表示するために break ステートメントを使っています。

    trap ステートメントでの break の使用

    trap ステートメントの本体で最後に実行されるステートメントが break である
    場合、エラーオブジェクトは抑制され、例外が再スローされます。

    次の例は、trap ステートメントで捕捉される DivideByZeroException 例外を
    作成します。

        function test {
          trap [DivideByZeroException] {
            Write-Host 'divide by zero trapped'
            break
          }

          $i = 3
          'Before loop'
          while ($true) {
             "1 / $i = " + (1 / $i--)
          }
          'After loop'
        }
        test

    例外の時点で実行が停止することに注目してください。'After loop' には決して
    到達しません。trap の実行後に例外が再スローされます。

        Before loop
        1 / 3 = 0.333333333333333
        1 / 2 = 0.5
        1 / 1 = 1
        divide by zero trapped
        ParentContainsErrorRecordException:
        Line |
          10 | "1 / $i = " + (1 / $i--)
             | ~~~~~~~~~~~~~~~~~~~~~~~~
             | Attempted to divide by zero.

    ループ・switch・trap の外で break を使わないこと

    break が、それを直接サポートする構文(ループ、switch、trap)の外で使われ
    ると、PowerShell は呼び出しスタックをさかのぼって、囲んでいる構文を探します。
    囲んでいる構文が見つからない場合、現在のランスペースは静かに終了します。

    つまり、それをサポートする構文の外で誤って break を使った関数やスクリプト
    は、その呼び出し元を意図せず終了させてしまうことがあります。

    ForEach-Object のスクリプトブロックなど、パイプラインの内側で break を
    使うと、パイプラインを抜けるだけでなく、ランスペース全体を終了させる
    おそれがあります。

関連項目
    about_Continue
    about_For
    about_Foreach
    about_Switch
    about_Trap
    about_While

----
原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP