about_Break

Kurze Beschreibung

Beschreibt eine Anweisung, die Sie zum sofortigen Beendenforeachfordowhileswitch, oder trap Anweisungen verwenden können.

Lange Beschreibung

Die break Anweisung bietet eine Möglichkeit, den aktuellen Steuerelementblock zu beenden. Die Ausführung wird nach dem Steuerelementblock bei der nächsten Anweisung fortgesetzt. Die Anweisung unterstützt Bezeichnungen. Eine Bezeichnung ist ein Name, den Sie einer Anweisung in einem Skript zuweisen.

Verwenden in break Schleifen

Wenn eine break Anweisung in einer Schleife angezeigt wird, z. B. ein foreach, whilefordooder eine Schleife, beendet PowerShell sofort die Schleife.

Eine break Anweisung kann eine Bezeichnung enthalten, mit der Sie eingebettete Schleifen beenden können. Eine Bezeichnung kann ein beliebiges Schleifenwort angeben, z foreach. B. , foroder whilein einem Skript.

Im folgenden Beispiel wird gezeigt, wie Sie eine Anweisung verwenden, um eine breakfor Anweisung zu beenden:

for($i=1; $i -le 10; $i++) {
   Write-Host $i
   break
}

In diesem Beispiel beendet die Anweisung die for Schleife, wenn die break$i Variable gleich 1 ist. Obwohl die for Anweisung auf True ausgewertet wird, bis $i es größer als 10 ist, erreicht PowerShell die Break-Anweisung, wenn die for Schleife zum ersten Mal ausgeführt wird.

Es ist häufiger, die break Anweisung in einer Schleife zu verwenden, in der eine innere Bedingung erfüllt sein muss. Betrachten Sie das folgende foreach Anweisungsbeispiel:

$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"

In diesem Beispiel wird die Anweisung das foreach$varB Array durchläuft. Die if Anweisung wird mit "False" ausgewertet, während die Schleife ausgeführt wird und die Variable $i um 1 erhöht wird. Das dritte Mal, wenn die Schleife ausgeführt wird, $i gleich 2, und die $val Variable entspricht 30. An diesem Punkt wird die Anweisung ausgeführt, und die breakforeach Schleife wird beendet.

Verwenden einer Beschriftung break in einer Schleife

Eine break Anweisung kann eine Bezeichnung enthalten. Wenn Sie das break Schlüsselwort mit einer Bezeichnung verwenden, beendet PowerShell die beschriftete Schleife, anstatt die aktuelle Schleife zu beenden. Die Bezeichnung ist ein Doppelpunkt gefolgt von einem Namen, den Sie zuweisen. Die Bezeichnung muss das erste Token in einer Anweisung sein, und es muss dem Looping-Schlüsselwort folgen, z while. B. .

break Verschiebt die Ausführung aus der beschrifteten Schleife. In eingebetteten Schleifen hat dies ein anderes Ergebnis als das break Schlüsselwort, wenn er selbst verwendet wird. In diesem Beispiel wird eine while Anweisung mit einer for Anweisung ausgeführt:

: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

Wenn die Bedingung 2 auf True ausgewertet wird, wird die Ausführung des Skripts nach der beschrifteten Schleife nach der Beschriftungsschleife nach unten übersprungen. In dem Beispiel beginnt die Ausführung erneut mit der Anweisung $a = $c.

Sie können viele beschriftete Schleifen verschachteln, wie im folgenden Beispiel dargestellt.

: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"

Wenn die Variable auf "True" ausgewertet wird, wird die $b Ausführung des Skripts nach der Schleife fortgesetzt, die als "rot" bezeichnet wird. Wenn die Variable auf "True" ausgewertet wird, wird die $c Ausführung des Skriptsteuerelements nach der Schleife fortgesetzt, die als "gelb" bezeichnet wird.

Wenn die Variable auf True ausgewertet wird, wird die $a Ausführung nach der innersten Schleife fortgesetzt. Es ist keine Bezeichnung erforderlich.

PowerShell beschränkt nicht, wie weit Beschriftungen die Ausführung fortsetzen können. Die Bezeichnung kann sogar Kontrolle über Skript- und Funktionsaufrufgrenzen übergeben.

Verwenden break in einer switch Anweisung

In einem switchKonstrukt break führt PowerShell zum Beenden des switch Codeblocks.

Das break Schlüsselwort wird verwendet, um das switch Konstrukt zu verlassen. Die folgende switch Anweisung verwendet break beispielsweise Anweisungen zum Testen für die spezifischste Bedingung:

$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
    }
}

In diesem Beispiel wird die $var Variable erstellt und auf einen Zeichenfolgenwert von word2. Die switch Anweisung verwendet die Regex-Klasse , um den Variablenwert zuerst mit dem Ausdruck word2übereinzugleichen. Da der Variablenwert und der erste Test in der Anweisung übereinstimmen, wird der erste Codeblock in der switchswitch Anweisung ausgeführt.

Wenn PowerShell die erste break Anweisung erreicht, wird die switch Anweisung beendet. Wenn die vier Anweisungen aus dem Beispiel entfernt werden, werden alle vier break Bedingungen erfüllt. In diesem Beispiel wird die Anweisung verwendet, um Ergebnisse anzuzeigen, wenn die break spezifischste Bedingung erfüllt ist.

Verwenden break in einer trap Anweisung

Wenn die endgültige Anweisung im Textkörper einer trap Anweisung breakausgeführt wird, wird das Fehlerobjekt unterdrückt und die Ausnahme wird erneut ausgelöst.

Im folgenden Beispiel wird eine DivideByZeroException-Ausnahme erstellt, die mithilfe der trap Anweisung aufgehalten wird.

function test {
  trap [DivideByZeroException] {
    Write-Host 'divide by zero trapped'
    break
  }

  $i = 3
  'Before loop'
  while ($true) {
     "1 / $i = " + (1 / $i--)
  }
  'After loop'
}
test

Beachten Sie, dass die Ausführung bei der Ausnahme beendet wird. Dies After loop ist nie erreicht. Die Ausnahme wird nach den trap Ausführungen erneut ausgelöst.

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.

Verwenden break Sie nicht außerhalb einer Schleife, switchoder trap

Wenn break außerhalb eines Konstrukts verwendet wird, das sie direkt unterstützt (Schleifen, switch, trap), sucht PowerShell den Anrufstapel für ein eingeschlossenes Konstrukt. Wenn es kein eingeschlossenes Konstrukt finden kann, wird der aktuelle Runspace ruhig beendet.

Dies bedeutet, dass Funktionen und Skripts, die versehentlich eine break außerhalb eines eingeschlossenen Konstrukts verwenden, die es unterstützt, ihre Anrufer versehentlich beenden können.

Wenn Sie break in einer Pipeline , z. B. einem ForEach-Object Skriptblock, nicht nur die Pipeline breakbeenden, wird möglicherweise der gesamte Runspace beendet.

Siehe auch