about_Break
簡単な説明
現在の制御ブロックを break
終了する方法を提供する ステートメントについて説明します。
長い説明
ステートメントは break
、現在の制御ブロックを終了する方法を提供します。
制御ブロックの後の次のステートメントで実行が続行されます。 ステートメントはラベルをサポートしています。 ラベルは、スクリプト内のステートメントに割り当てる名前です。
in ループの使用break
break
、、、または while
ループなどのループ内にステートメントがforeach
for
do
表示されると、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 より大きくなるまで $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
は、ラベル付けされたループから実行を移動します。 埋め込みループでは、この結果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
文字列値に初期化されます。 ステートメントは switch
Regex クラスを使用して、変数の値を最初に という用語 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
)、switch
PowerShell は、外側のコンストラクトの呼び出し履歴を検索します。 外側のコンストラクトが見つからない場合、現在の実行空間は静かに終了します。
つまり、それをサポートする外側のコンストラクトの外部で誤って を使用 break
する関数とスクリプトは、 誤って呼び出し元を終了する可能性があります。
スクリプト ブロックなどのForEach-Object
パイプラインbreak
内で を使用するとbreak
、パイプラインが終了するだけでなく、実行空間全体が終了する可能性があります。