about_Break
現在の制御ブロックを終了する方法を提供する break
ステートメントについて説明します。
break
ステートメントは、現在の制御ブロックを終了する方法を提供します。
制御ブロックの後の次のステートメントで実行が続行されます。 このステートメントはラベルをサポートしています。 ラベルは、スクリプト内のステートメントに割り当てる名前です。
foreach
、for
、do
、while
ループなどの break
ステートメントがループ内に表示されると、PowerShell はすぐにループを終了します。
break
ステートメントには、埋め込みループを終了できるラベルを含めることができます。 ラベルは、スクリプト内の任意のループ キーワード (foreach
、for
、while
など) を指定できます。
次の例は、break
ステートメントを使用して for
ステートメントを終了する方法を示しています。
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
この例では、$i
変数が 1 の場合、break
ステートメントは for
ループを終了します。
for
ステートメントは、$i
が 10 より大きくなるまで 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
キーワードを使用すると、PowerShell は現在のループを終了するのではなく、ラベル付きループを終了します。
ラベルはコロンの後に、割り当てる名前が続きます。 ラベルはステートメントの最初のトークンである必要があり、その後にループ キーワード (while
など) が続く必要があります。
break
は、ラベル付けされたループから実行を移動します。 埋め込みループでは、break
キーワードが単独で使用する場合とは異なる結果になります。 この例には、for
ステートメントを含む while
ステートメントがあります。
: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
によって 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
ステートメントを使用してトラップされる 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.
break
を直接サポートするコンストラクト (ループ、switch
、trap
) の外部で使用すると、PowerShell は外側のコンストラクトの呼び出し履歴 を 検索します。 外側のコンストラクトが見つからない場合、現在の実行空間は静かに終了します。
これは、それをサポートする外側のコンストラクトの外部で誤って break
を使用する関数とスクリプトが、呼び出し元のを誤って終了する可能性があることを意味します。
ForEach-Object
スクリプト ブロックなど、パイプライン break
内で break
を使用すると、パイプラインが終了するだけでなく、実行空間全体が終了する可能性があります。
PowerShell に関するフィードバック
PowerShell はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。