about_Break
簡短描述
描述您可以用來立即結束 foreach
、for
、、、do
while
、 switch
或 trap
語句的語句。
完整描述
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,則腳本控件的執行會在標示為 「黃色」的循環之後繼續執行。
$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.
請勿在迴圈外部使用 break
、 switch
或 trap
在直接支援它的建構外部使用 時 break
, (迴圈、 switch
、 trap
) ,PowerShell 會查閱封入建構的 呼叫堆棧 。 如果找不到封入建構,則會以無訊息方式終止目前的 Runspace。
這表示不小心使用 break
封入建構外部的函式和腳本,可不小心終止其 呼叫端。
在管線內使用 break
,例如ForEach-Object
腳本區塊,不僅會結束管線break
,也會終止整個 Runspace。