HOWTO · PowerShell
Zu bestimmten Stellen im PowerShell-Skript springen
PowerShell hat keinen GOTO-Befehl. Lernen Sie, mit function, if und switch zu verzweigen, mit while und for zu wiederholen und verschachtelte Schleifen mit gelabeltem break und continue zu verlassen.
Auf dieser Seite
PowerShell hat keinen goto-Befehl. In einer cmd.exe-Batch-Datei sendet GOTO :label die Ausführung an eine beschriftete Zeile, damit Sie vorwärtsspringen oder zurückschleifen können. PowerShell lässt dieses Schlüsselwort bewusst weg. Stattdessen springen Sie zu einer benannten Stelle, indem Sie eine function aufrufen, wählen einen Pfad mit if / elseif / else oder switch, wiederholen Arbeit mit while oder for und verlassen verschachtelte Schleifen mit gelabeltem break oder continue.
Diese Steuerfluss-Features funktionieren in Windows PowerShell 5.1 und in PowerShell 7 gleich. Die folgenden Beispiele wurden mit PowerShell 7.6.6 geprüft. Nutzen Sie sie, wenn Sie Batch-Skripte umstellen, Menüs bauen oder eine lange .ps1-Datei ohne Spaghetti-Sprünge organisieren.
Mit Funktionen zu benannten Stellen springen
Eine Funktion ist ein benannter Block, den Sie von anderer Stelle im Skript aufrufen können. Das ist die sicherste PowerShell-Entsprechung von „springe zu diesem Abschnitt“ und ersetzt Batch-CALL/Label-Unterroutinen sowie viele GOTO-Verwendungen. Definieren Sie die Funktion in einer Skriptdatei, bevor Sie sie aufrufen.
function Choice {
$continue = Read-Host "Do you want to continue?"
if ($continue -eq 'y') {
Write-Host "Welcome to PowerShell tutorials."
}
else {
Write-Host "Exited."
}
}
Choice
Ausgabe, wenn die Antwort y lautet:
Do you want to continue?: y
Welcome to PowerShell tutorials.
Ausgabe, wenn die Antwort nicht y lautet:
Do you want to continue?: n
Exited.
Verwenden Sie return innerhalb einer Funktion, wenn Sie nur diese Funktion vorzeitig verlassen müssen. Der folgende Grenzfall liefert "invalid" für einen negativen Code und sonst "ok:<n>":
function Get-Status {
param([int]$Code)
if ($Code -lt 0) {
return "invalid"
}
return "ok:$Code"
}
Get-Status -Code -1
Get-Status -Code 2
invalid
ok:2
return verlässt die aktuelle Funktion, das Skript oder den Skriptblock. Bevorzugen Sie es gegenüber exit, es sei denn, Sie wollen den PowerShell-Prozess absichtlich beenden und einen Prozess-Exitcode für einen Aufrufer oder Scheduler setzen. Wiederverwendbare Arbeit in Funktionen erleichtert später auch Tests, weil Sie eine Stelle aufrufen können, ohne das ganze Skript laufen zu lassen.
Mit if und switch verzweigen
Bedingte Anweisungen wählen, welche Stelle als Nächstes läuft. Eine if / elseif / else-Kette eignet sich für wenige Optionen. Eine switch-Anweisung ist klarer für menüartige Navigation und ersetzt Batch-Muster wie IF ... GOTO sectionA gefolgt von einem weiteren GOTO an den ungenutzten Abschnitten vorbei.
$action = Read-Host "Enter 1 for date marker or 2 for greeting"
switch ($action) {
'1' { Write-Output "DATE_MARKER" }
'2' { Write-Output "Hello, welcome to the PowerShell tutorial!" }
default { Write-Output "Invalid option selected." }
}
Auswahl von 2:
Enter 1 for date marker or 2 for greeting: 2
Hello, welcome to the PowerShell tutorial!
Auswahl einer ungültigen Option:
Enter 1 for date marker or 2 for greeting: x
Invalid option selected.
Jeder Zweig ist ein vollständiger Block, sodass Sie keinen zweiten Sprung brauchen, um die anderen Abschnitte zu „überspringen“.
Mit while und for wiederholen
Schleifen sind der strukturierte Ersatz dafür, zu einem Start-Label wie :start zurückzuspringen. Eine while-Anweisung führt ihren Block aus, solange die Bedingung $true ist. Ist die Bedingung bereits $false, überspringt PowerShell den Block und fährt nach der Schleife fort — ein kontrolliertes Überspringen, kein beliebiger Label-Sprung.
$a = 1
while ($a -lt 10) {
$a
$a++
}
1
2
3
4
5
6
7
8
9
Grenzfall — der Schleifenkörper läuft nie:
$a = 10
Write-Output "before"
while ($a -lt 10) {
$a
$a++
}
Write-Output "after"
before
after
Eine for-Schleife ist nützlich, wenn Sie Initialisierung, Bedingung und Iterator zusammen brauchen:
for ($b = 1; $b -lt 6; $b++) {
Write-Host $b
}
1
2
3
4
5
PowerShell bietet außerdem do/while, do/until und foreach, wenn Sie mindestens einmal ausführen oder eine Sammlung durchlaufen wollen. Das folgt derselben Idee strukturierter Schleifen statt eines Batch-GOTO :start. Für ein Menü, das bis zum Beenden erneut erscheinen soll, packen Sie Prompt und switch in eine while ($true)-Schleife und nutzen break, wenn die Exit-Option gewählt wird.
Verschachtelte Schleifen mit gelabeltem break und continue verlassen
PowerShell-Bezeichnungen (Labels) sind keine Batch-Sprungziele. Ein Label wie :outer darf unmittelbar vor einem Schleifen- oder switch-Schlüsselwort stehen. Dann verwenden Sie break outer oder continue outer — ohne Doppelpunkt in der break-/continue-Zeile —, um dieses Konstrukt anzusprechen. Microsoft dokumentiert diese Form in about_Break und about_Continue; Seiten, die goto :Label oder break :Label als PowerShell-Syntax zeigen, sind falsch.
:outer for ($i = 1; $i -le 3; $i++) {
for ($j = 1; $j -le 3; $j++) {
Write-Output "i=$i j=$j"
if ($j -eq 2) {
break outer
}
}
}
Write-Output "done"
i=1 j=1
i=1 j=2
done
Wenn $j gleich 2 ist, verlässt break outer die gelabelte äußere Schleife vollständig und fährt bei Write-Output "done" fort. Ein ungelabeltes break würde nur die innere for-Schleife verlassen. Nutzen Sie continue outer, wenn Sie den Rest der aktuellen äußeren Iteration überspringen und die nächste starten wollen, statt die äußere Schleife zu beenden.
Erfinden Sie keine PowerShell-goto :label-Anweisung und setzen Sie kein nacktes :label in der Erwartung eines Batch-artigen Landepunkts. Vermeiden Sie außerdem break oder continue außerhalb einer Schleife, eines switch oder eines trap: PowerShell kann den Aufrufstapel durchlaufen und die aktuelle Runspace still beenden, wodurch ein Aufrufer stoppt, den Sie nicht beenden wollten.
Die passende Sprungmethode wählen
| Ziel | Bevorzugen |
|---|---|
| Benannten wiederverwendbaren Abschnitt ausführen | function + Aufruf, optional return |
| Unter Optionen wählen | if / elseif / else oder switch |
| Wiederholen oder zurückschleifen | while, for, do oder foreach |
| Verschachtelte Schleife früh verlassen | gelabeltes break / continue |
| Gesamten Prozess beenden | exit (vorsichtig einsetzen) |
Halten Sie Skripte lesbar: bevorzugen Sie Funktionen und Bedingungen für die meisten „Sprung“-Bedürfnisse, nutzen Sie Schleifen für Wiederholung und reservieren Sie Labels für die Steuerung verschachtelter Schleifen. Leistung ist selten der entscheidende Faktor; Klarheit und ein einziger offensichtlicher Exit-Pfad zählen mehr, wenn Sie das Skript später pflegen.
FAQ
Hat PowerShell ein goto?
Nein. Anders als bei cmd.exe-Batch gibt es in PowerShell kein goto-Schlüsselwort. Offizielle Sprachschlüsselwörter und die PowerShell-Sprachspezifikation listen break, continue, throw, return und exit für die Ablaufsteuerung — nicht goto.
Wozu dienen PowerShell-Labels?
Labels markieren eine Schleife oder ein switch, damit break / continue sie ansteuern können. Sie erzeugen keine beliebigen Sprungziele wie Batch-:label-Zeilen.
Was ist die beste Alltag-Alternative zu Batch-GOTO?
Rufen Sie für eine benannte Stelle eine Funktion auf, oder nutzen Sie if / switch und Schleifen für Verzweigung und Wiederholung. Greifen Sie erst zu gelabeltem break, wenn verschachtelte Schleifen einen kontrollierten äußeren Exit brauchen.
Kann ich diese Techniken kombinieren?
Ja. Eine Menüfunktion nutzt oft switch in einer while-Schleife, und verschachtelte Verarbeitung kann ein gelabeltes break ergänzen, wenn eine äußere Schleife stoppen muss.
Funktionieren diese Beispiele unter Windows PowerShell 5.1?
Ja für die hier gezeigten Sprachfeatures. Die geprüften Ausgaben stammen von PowerShell 7.6.6; die Host-Prompt-Formatierung von Read-Host kann je nach Host leicht abweichen.