次の方法で共有


about_Break

簡単な説明

現在の制御ブロックを break 終了する方法を提供するステートメントについて説明します。

詳細な説明

このステートメントは break 、現在の制御ブロックを終了する方法を提供します。 制御ブロックの後の次のステートメントで実行が続行されます。 このステートメントはラベルをサポートしています。 ラベルは、スクリプト内のステートメントに割り当てる名前です。

in ループの使用break

ステートメントがbreakループ (たとえば、foreachforまたはdowhileループ) に表示されると、PowerShell はすぐにループを終了します。

ステートメントには break 、埋め込みループを終了できるラベルを含めることができます。 ラベルは、スクリプト内の任意のループ キーワード (keyword) (例foreach: )for、または while、を指定できます。

次の例は、ステートメントを使用してステートメントを break 終了する方法を for 示しています。

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

この例では、変数が break 1 の場合、ステートメントはループを$i終了forします。 ステートメントが for 10 より大きくなるまで $i True評価される場合でも、PowerShell はループの初回実行時に break ステートメントにfor到達します。

内部条件を満たす必要があるループでステートメントを使用 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 反復処理します。 ステートメントは if 、ループが実行され、変数 $i が 1 ずつインクリメントされた最初の 2 回は False に評価されます。 ループが 3 回目に実行され、 $i 2、変数が $val 30 になります。 この時点でステートメントが break 実行され、ループが foreach 終了します。

ループ内でラベル付けされた break コードを使用する

ステートメントには break ラベルを含めることができます。 ラベルでキーワード (keyword)をbreak使用すると、PowerShell は現在のループを終了するのではなく、ラベル付きループを終了します。 ラベルはコロンの後に、割り当てる名前が続きます。 ラベルはステートメントの最初のトークンである必要があり、その後にループキーワード (keyword)がwhile続く必要があります。

break は、ラベル付けされたループから実行を移動します。 埋め込みループでは、これはキーワード (keyword)が単独で使用する場合とはbreak異なる結果になります。 この例には、ステートメントを while 含むステートメントがあります for

:myLabel while (<condition 1>) {
  for ($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

条件 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 キーワード (keyword)は、コンストラクトを終了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エラー オブジェクトは抑制され、例外が再スローされます。

次の例では、ステートメントを 使用してトラップされる DivideByZeroException 例外を trap 作成します。

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.

ループの外部では使用breakしないでください。 switchtrap

それを直接サポートするコンストラクトの外部で使用する場合 break (ループ、、)trapswitchPowerShell は外側のコンストラクトの呼び出し履歴を検索します。 外側のコンストラクトが見つからない場合、現在の実行空間は静かに終了します。

これは、それをサポートする外側のコンストラクトの外側を break 誤って使用する関数とスクリプトが、誤って呼び出し元を 終了する可能性があることを意味します

スクリプト ブロックなどのパイプラインbreak内でForEach-Object使用するとbreak、パイプラインが終了するだけでなく、実行空間全体が終了する可能性があります。

関連項目