Aufruf von Programmen mit Call Befehl Verfasst am: 19.05.2009, 10:10
In einem BAT-Ablauf lassen sich nicht nur .COM und .EXE Programme
aufrufen, sondern auch andere .BAT Ablaeufe. Verwendet man nun den
Namen einer BAT-Datei als Befehl, dann sollte man meinen, dass DOS
- wie bei Ausfuehrung eines Programmes - anschliessend in der
aufrufenden BATCH weitermacht.
Das aber geht nur mit dem CALL-Befehl, sonst wird der (erste)
BAT-Ablauf NICHT fortgesetzt!
Dazu muss man verstehen, dass es in den ersten DOS-Versionen
(vor DOS 3.3) gar keine Verschachtelung von BAT-Ablaeufen gab.
Die Beendigung eines Batch-Ablaufs bei einem weiteren Aufruf war
also zwangslaeufig. Als DOS dann weiterentwickelt wurde, hat man
halt den CALL erfunden. Also:
XXX.BAT setzt den Ablauf in XXX.BAT fort, OHNE zur
aufrufenden Batch zurueckzukehren
CALL XXX.BAT kehrt nach Ausfuehrung von XXX.BAT zurueck.
Befehlsparameter koennen in jedem Falle uebergeben werden, auch
weitergegeben werden, z.B.:
CALL update %1 A:
Nach Ausfuehrung einer BATCH mit CALL sind selbstverstaendlich
die Befehlsparameter des ersten Ablaufs wieder verfuegbar, denn
DOS fuehrt fuer jede weitere BAT-Ebene einen eigenen Steuerblock
im Arbeitsspeicher, wo u.a. auch die jeweiligen Befehlsparameter
abgelegt sind.
Sollen von der aufgerufenen Batch irgendwelche Werte zurueckgegeben
werden, so sind dafuer Umgebungsvariable zu verwenden (s.
spaerete Lektion). Der zuletzt von einem Programm erzeugte Return-
Code kann aber noch nach der Rueckkehr in die aufrufende Batch per
ERRORLEVEL abgefragt werden. (Ein BAT-Ablauf selbst produziert
keinen Return-Code/Errorlevel.)
Rekursion
Grundsaetzlich kann auch die selbe BATCH per CALL (rekursiv)
aufgerufen werden, entweder direkt oder auf Umwegen ueber weitere
CALLs, - aber dann sollte man schon was davon verstehen, sonst
pflastert DOS den Arbeitsspeicher mit Steuerbloecken voll, von
anderen moeglichen Overflows ganz zu schweigen.
Manchmal geschieht so etwas unbeabsichtigt. Uebersichtliche CALLStrukturen
sind daher immer eine gute Investition. (Es gelten die
allgemeinen Regeln der Programmierkunst!)
Rekursionen koennen auch auftreten, wenn aus einem Programm heraus
(z.B. Mailer) eine weitere DOS-Shell mit Batch-Ablauf gestartet
wird. Ohne saubere Trennung der einzelnen BAT-Ebenen kommt es hier
leicht zu Ueberraschungseffekten...
QUIT
Ein spezieller BAT-Aufruf ohne CALL hat sich als recht nuetzlich
zum Abbruch einer BATCH erwiesen: Es wird einfach eine leere BATDatei,
z.B. mit dem Namen QUIT.BAT, gerufen. Dies geht normalerweise
schneller als ein GOTO ans Ende der laufenden BAT-Datei
(was daran liegt, dass DOS keine sonderlich effiziente Batchverarbeitung
hat). Beispiel:
IF errorlevel 3 QUIT
Anstelle der leeren QUIT.BAT kann auch folgende einzeilige BATDatei
verwendet werden:
%1 %2 %3 %4 %5 %6 %7 %8 %9
Damit wird aus allen Angaben (bis zu 9), die nach QUIT folgen,
eine Befehlszeile produziert und ausgefuehrt. Oft laesst sich
auf diese Weise eine extra GOTO-Konstruktion einsparen.
Benutzungsbeispiele:
QUIT cls
QUIT echo Datei %1 ist nicht vorhanden - Abgebrochen!
QUIT del *.TMP
Abbruch bei GOTO-Fehler
An dieser Stelle noch ein Hinweis auf eine besondere Tuecke von
DOS: Sollte bei einem GOTO das Sprungziel nicht gefunden werden,
beendet DOS nicht nur die laufende BATCH mit einer Fehlermeldung,
sondern saemtliche per CALL entstandene Verschachtelungsebenen! _________________