about_Break
簡短描述
描述 break
語句,其提供結束目前控件區塊的方式。
詳細描述
break
語句提供結束目前控件區塊的方式。
執行會在控制區塊之後的下一個語句繼續執行。 語句支持標籤。 標籤是您指派給文稿中語句的名稱。
在迴圈中使用break
break
當語句出現在迴圈中時,例如 foreach
、for
、 do
或 while
迴圈,PowerShell 會立即結束迴圈。
break
語句可以包含可讓您結束內嵌迴圈的標籤。 標籤可以在文稿中指定任何循環關鍵字,例如 foreach
、 for
或 while
。
下列範例示範如何使用 break
語句結束 for
語句:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
在此範例中break
,當變數等於 1 時$i
,語句會結束for
迴圈。 即使 for
語句評估為 True ,直到 $i
大於 10 為止,PowerShell 還是會在第一次執行循環時 for
到達 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
執行迴圈的前兩次評估為 False,而變數 $i
會遞增 1。 第三次執行迴圈時, $i
等於 2,而 $val
變數等於 30。 此時,語句會 break
執行,而循環會 foreach
結束。
在迴圈中使用加上標籤 break
的
break
語句可以包含標籤。 如果您使用 break
關鍵詞搭配標籤,PowerShell 會結束加上標籤的迴圈,而不是結束目前的迴圈。
卷標是冒號,後面接著您指派的名稱。 標籤必須是語句中的第一個標記,而且它後面必須接著迴圈關鍵詞,例如 while
。
break
會將執行移出加上標籤的迴圈。 在內嵌迴圈中,這個結果與關鍵詞本身使用時的結果 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,腳本的執行會在標示為 「紅色」的循環之後繼續執行。 $c
如果變數評估為 True,腳本控件的執行會在標示為 「yellow」 的循環之後繼續執行。
$a
如果變數評估為 True,則執行會在最內部循環之後繼續執行。 不需要標籤。
PowerShell 不會限制標籤可以繼續執行的時間。 標籤甚至可以跨腳本和函數調用界限傳遞控制件。
break
在語句中使用switch
在 建構中 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
結束。 如果從範例中移除四 break
個語句,則會符合所有四個條件。 此範例會 break
使用 語句,在符合最特定的條件時顯示結果。
break
在語句中使用trap
如果在語句主體中執行的最後一個 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
在直接支援它的建構外部使用 時break
,switch
trap
PowerShell 會查閱封入建構的呼叫堆棧。 如果找不到封入建構,則目前的 Runspace 會悄悄終止。
這表示不小心使用 break
封入建構外部的函式和腳本,可不小心終止其 呼叫端。
在管線break
內使用 break
,例如ForEach-Object
腳本區塊,不僅會結束管線,而且可能會終止整個 Runspace。