次の方法で共有


about_Break

簡単な説明

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

長い説明

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

in ループの使用break

break、、、または while ループなどのループ内にステートメントがforeachfordo表示されると、PowerShell はすぐにループを終了します。

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

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

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

この例では、変数が break 1 の場合、 for ステートメントはループを $i 終了します。 ステートメントは for 10 より大きくなるまで $iTrue と評価されますが、ループが初めて実行されるときに、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 は、ラベル付けされたループから実行を移動します。 埋め込みループでは、この結果breakは、キーワード (keyword)自体で使用される場合とは異なります。 この例には、 ステートメントと 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 では、ラベルが実行を再開できる距離は制限されません。 ラベルは、スクリプトと関数呼び出しの境界を越えて制御を渡すことさえできます。

ステートメントで を使用breakするswitch

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文字列値に初期化されます。 ステートメントは switchRegex クラスを使用して、変数の値を最初に という用語 word2と照合します。 変数の値とステートメント内の最初のテストが switch 一致するため、ステートメント内の最初のコード ブロックが switch 実行されます。

PowerShell が最初 break のステートメントに到達すると、 ステートメントは switch 終了します。 この例から 4 つの break ステートメントが削除されると、4 つの条件すべてが満たされます。 この例では、 ステートメントを break 使用して、最も具体的な条件が満たされたときに結果を表示します。

ステートメントで を使用breakするtrap

ステートメントの本体で実行される最後の 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.

ループ、、switchまたは の外部では使用breakしないでくださいtrap

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

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

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

こちらもご覧ください