簡短描述
描述 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 時for,語句會結束$i迴圈。 即使陳述 for 式評估為 True until $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>) {
foreach ($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 例外狀況。
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
Attempted to divide by zero.
At line:10 char:6
+ "1 / $i = " + (1 / $i--)
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
請勿在迴圈之外使用 break , switch或 trap
在直接支援它的建構外部使用 時break,switchtrapPowerShell 會查閱封入建構的呼叫堆棧。 如果找不到封入建構,則目前的 Runspace 會悄悄終止。
這表示不小心使用支援它的封閉建構外部的 break 函式和腳本可能會不小心終止其 呼叫端。
在管線break內使用 break ,例如ForEach-Object腳本區塊,不僅會結束管線,而且可能會終止整個 Runspace。