about_Break

簡単な説明

、、、、、またはステートメントをすぐに終了 do while for foreach switch するために使用できるステートメントについて説明します。 trap

長い説明

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

In ループの使用 break

breakループ内にステートメントが含まれて foreach いる場合 (、 for do 、、または while ループなど)、PowerShell はすぐにループを終了します。

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

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

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

この例では、変数が $i 1 と等しい場合、ステートメントは break ループを for 終了します。 forが10を超えるまで $i ステートメントが True と評価された場合でも、最初にループが実行されたとき for に PowerShell は 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 反復処理します。 ifステートメントは、ループの最初の2回の実行時に False と評価され、変数 $i は1ずつインクリメントされます。 ループが3回実行された場合 $i 、は2になり、変数は $val 30 と等しくなります。 この時点で、ステートメントが break 実行され、ループが foreach 終了します。

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

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

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

: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

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 と評価された場合、スクリプトコントロールの実行は、"黄色" というラベルが付いたループの後に再開されます。

変数が True と評価される $a と、最も内側のループの後に実行が再開されます。 ラベルは必要ありません。

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 、またはの外部では使用 break しないでください。trap

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

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

パイプライン内 break でを使用する breakForEach-Object 、パイプラインが終了するだけでなく、実行空間全体が終了する可能性があります。

関連項目