In moderneren Programmier- und Skriptsprachen wie PowerShell verschwindet aus berechtigten Gründen die Möglichkeit die goto-Funktion zu nutzen. Dadurch lässt sich einfach zu schnell Spaghetti-Code fabrizieren und bei wachsenden Skripten und langem Quellcode verliert man so relativ schnell den Überblick, wann etwas durch goto an welcher Stelle bzw. zu welchem Zeitpunkt im PowerShell-Skript passiert.
Allerdings wollen genügend Programmierer, vermutlich für eine schnelle Quick&Dirty-Umsetzung, trotzdem noch gerne goto und Sprungmarken in einem solchen PowerShell-Skript verwenden. Auch wenn es nicht zu empfehlen ist, kann man sich mit Hilfe der Switch-Funktion eine goto-ähnliche Funktionsweise des Skriptes aufbauen!
Goto durch Funktion mit Switch-Case
Die neue Skriptsprache PowerShell bietet im Vergleich zu einfachen Batch-Skripten viele andere Kontrollstrukturen und vereinfachte Schleifen, mit denen man viel komfortabler programmieren und Code einsparen und wiederverwenden kann, als mit den beliebten goto-Statements.
Trotzdem kann man sich mit eben diesen neuen Kontrollstrukturen auch wieder die alten goto-Statements auf die eine oder andere Weise zurückholen. Hierzu kann man z. B. eine Funktion namens „goto“ erstellen. In dieser nutzt man die Switch-Case-Funktion und teilt sich dadurch seinen Code in Abschnitte ein. Wichtig ist, dass das gesamte Skript nun in dieser einzigen goto-Funktion aufgebaut wird! Am Ende jeden Abschnitts muss der jeweils nächste Abschnitt aufgerufen werden. Am Ende ruft man die goto-Funktion mit der Ausführung des ersten Abschnitts, also dem ersten Case, auf. Das sieht beispielweise so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function goto($x){ switch ($x) { 0 { Write-Host "0" goto(1) } 1 { Write-Host "1" goto(2) } 2 { Write-Host "2" goto(3) } 'Ende' { Write-Host "Ende" } } } goto(0) |
Nun kann man natürlich innerhalb der Abschnitte z. B. mit „if und else“-Abfragen hin und her springen und auch wieder einen anderen als den nächsten Abschnitt aufrufen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
function goto($x){ switch ($x) { 0 { Write-Host "0" goto(1) } 1 { if ($var -eq 0){ $var = 0 goto(0) } Write-Host "1" goto(2) } 2 { Write-Host "2" goto(3) } 'Ende' { Write-Host "Ende" } } } goto(0) |