about_Break
簡単な説明
現在の制御ブロックを break
終了する方法を提供するステートメントについて説明します。
詳細な説明
このステートメントは break
、現在の制御ブロックを終了する方法を提供します。
制御ブロックの後の次のステートメントで実行が続行されます。 このステートメントはラベルをサポートしています。 ラベルは、スクリプト内のステートメントに割り当てる名前です。
in ループの使用break
ステートメントがbreak
ループ (たとえば、foreach
for
またはdo
while
ループ) に表示されると、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
しないでください。 switch
trap
それを直接サポートするコンストラクトの外部で使用する場合 break
(ループ、、)trap
、switch
PowerShell は外側のコンストラクトの呼び出し履歴を検索します。 外側のコンストラクトが見つからない場合、現在の実行空間は静かに終了します。
これは、それをサポートする外側のコンストラクトの外側を break
誤って使用する関数とスクリプトが、誤って呼び出し元を 終了する可能性があることを意味します。
スクリプト ブロックなどのパイプラインbreak
内でForEach-Object
使用するとbreak
、パイプラインが終了するだけでなく、実行空間全体が終了する可能性があります。
関連項目
PowerShell