about_Break

簡短描述

描述 break 語句,其提供結束目前控件區塊的方式。

詳細描述

break語句提供結束目前控件區塊的方式。 執行會在控制區塊之後的下一個語句繼續執行。 語句支持標籤。 標籤是您指派給文稿中語句的名稱。

在迴圈中使用break

break當語句出現在迴圈中時,例如 foreachfordowhile 迴圈,PowerShell 會立即結束迴圈。

break語句可以包含可讓您結束內嵌迴圈的標籤。 標籤可以在文稿中指定任何循環關鍵字,例如 foreachforwhile

下列範例示範如何使用 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

在 建構中 switchbreak 導致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、 或外部使用breaktrap

在直接支援它的建構外部使用 時breakswitchtrapPowerShell 會查閱封入建構的呼叫堆棧。 如果找不到封入建構,則目前的 Runspace 會悄悄終止。

這表示不小心使用 break 封入建構外部的函式和腳本,可不小心終止其 呼叫端

在管線break內使用 break ,例如ForEach-Object腳本區塊,不僅會結束管線,而且可能會終止整個 Runspace。

另請參閱