While- und Until-Schleifen in Batch-Dateien

In Batch-Dateien ist vieles nicht vorgesehen gewesen und mit Boardmitteln auch nicht möglich. So gibt es auch keine brauchbaren standardmäßigen Möglichkeiten, Schleifen einzusetzen, außer einer For-Schleife. Ich benötigte eine Schleife in einer Batch-Datei, in der eine Schleife eine bestimmte Anzahl Maximaldurchgänge hat, was sich mit einer For-Schleife realisieren lässt, aus der man aber nicht per goto-Befehl „ausbrechen“ kann, weil dies bei Batch-Dateien nicht vorgesehen ist. Somit würde die Maximalanzahl an Durchläufen immer durchgeführt werden, auch wenn das eigentliche Ziel schon beim ersten Versuch erreicht wurde. Mit Powershell wäre das einfach gewesen, steht aber leider auf den Zielsystemen nicht zur Verfügung. Das ist aber trotzdem kein Problem.

Glücklicherweise kann man sich aber auch in einer so rudimentären „Sprache“ wie bei Batch-Dateien, die anderen Schleifenarten wie While- und Until-Schleifen einfach selber bauen, solange man If-Abfragen und Sprungmarken mittels goto nutzen kann. Lediglich der Komfort leidet natürlich und der Code ist unübersichtlicher als es in einer vernünftigen Programmiersprache der Fall wäre. Dies ist aus Performancegründen zwar eigentlich zu unterlassen, da dieses Gespringe wohl die CPU-Last erhöht, aber who cares?

In folgendem Beispiel ist eine, auch als For-Schleife umsetzbare, Zählschleife mit einfachen Mitteln umgesetzt worden:

Diese Schleife produziert die gleiche Ausgabe wie folgende For-Schleife:

Nämlich die einfache Ausgabe des je Durchlauf aktuellen Wertes der Zählvariable:

 

 

While-Schleifen

Eine While-Schleife wiederholt die Anweisungen solange die Bedingung „True“ als Wert zurückgibt. Ist also direkt am Anfang die Bedingung „False“, wird die Schleife nicht ein einziges Mal durchlaufen. Mit if, einer Hilfsvariable und goto ließe sich das z. B. so realsieren:

 

… oder ohne die Hilfsvariable, wenn eine Prüfung auf eine Bedingung nicht zu umfangreich ist und sich der Code so etwas vereinfachen lässt:

 

Im Gegensatz zur While-Schleife wird eine Do-While-Schleife mindestens einmal durchlaufen, bis die Bedingung „False“ ist. Hierfür muss man nur das vorherige Beispiel so umstellen, sodass der Anweisungsblock sich vor der Bedingungsprüfung, also dem if-Block, befindet:

 

Das ganze geht natürlich auch bei der Do-While-Schleife ohne Hilfsvariable und wirkt dann aufgeräumter:

 

 

Until-Schleifen

Um eine Until-Schleife zu relaisieren, müsste man theoretisch nur die Bedingungsprüfung in der While-Schleife so umbauen, sodass die Schleife solange läuft wie die Bedingung „False“ zurückliefert, da eine Until-Schleife stoppt sobald die Bedingung „True“ wird. Da dies aber kein richtiger Abbruch der Schleife ist, sondern immer noch eine While-Schleife die einfach nur andersherum prüft, habe ich mich für folgende explizitere Abbruch-Variante entschieden:

 

Für eine Do-Until-Schleife muss man nur, wie schon bei der Do-While-Schleife, den Anweisungsblock vor die Bedingungsprüfung setzen, sodass dieser mindestens einmal durchlaufen wird:

 

Schreibe einen Kommentar