Die DOS-Versionen 3.3 hat uns also nun endlich mit dem anspruchsvollen CALL-Befehl verwöhnt, der es Stapeldateien erlaubt, sich gegenseitig als Unterprogramme aufzurufen.
CALL benötigt im Gegensatz zum umständlich zu gebrauchenden »COMMAND /C Stapel Parameter« älterer DOS-Versionen auch kaum zusätzlichen Speicher. Schnelle Festplatten und der bequeme Aufruf anderer Stapeljobs aus einem Stapeljob mit der CALL-Anweisung erleichtern die Entwicklung und rege Nutzung solcher Programme um ein Vielfaches. Kein Wunder, daß z. B. Batchfiles mit Installationsanweisungen häufig versagen, weil der Programmierer ältere DOS-Versionen als 3.3 schlichtweg übersehen hat. Diese kennen CALL nicht und reagieren mit »Bad command or file name«. CALL.DEB hilft, den Fehler zu vermeiden. Das Programm ruft eine Kopie des Kommando-Interpreters COMMAND.COM auf und erteilt ihm die Anweisung, den als Parameter übergebenen Befehl abzuarbeiten. Dieser kann ein BAT,- COM- oder EXE-Programm sein. Packen Sie CALL.COM also einfach zusätzlich auf die Installationsdiskette, und Sie werden nie mehr Ärger haben: Läuft der PC unter DOS 3.3 oder höher, nimmt DOS den internen CALL. Wenn es den wie z. B. unter DOS 3.2 nicht gibt, verwendet das Betriebssystem unseren CALL. Achtung! In DOS-Versionen vor 3.3 ist es nicht möglich, in einem Stapel-Unterprogramm Environment-Variablen mit »SET…« zu setzen, um sie anschließend wieder im aufrufenden Stapeljob über »IF…« oder umgekehrt auszuwerten. Jede Änderung einer Environment-Variable geht nämlich nach der Rückkehr in die höhere Ebene genau wie die Kopie von COMMAND.COM wieder verloren. Dazu ein Beispiel:
ECHO OFF ECHO 1. Stapeljob (AUFRUF.BAT) ECHO Aufruf eines Unterprogramms mit CALL.COM: SET BEISPIEL= CALL UNTER.BAT ECHO Der folgende Vergleich wird in DOS-Versionen, ECHO die älter als 3.30 sind, nicht zutreffen: IF "%BEISPIEL%"=="BELEGT" GOTO RICHTIG :FALSCH ECHO Die Variable BEISPIEL ist nicht BELEGT. GOTO ENDE :RICHTIG ECHO Die Variable BEISPIEL ist BELEGT. :ENDE
ECHO 2. Stapeljob (UNTER.BAT) ECHO In DOS-Versionen, die älter als 3.30 sind, ECHO wird die folgende Belegung des DOS-Environments ECHO nach der Rückkehr nach AUFRUF.BAT nicht mehr ECHO existieren: SET BEISPIEL=BELEGT ECHO Zurück zu AUFRUF.BAT...
Wenn Sie in älteren DOS-Versionen auf die Belegung von Systemvariablen in Unterstapeljobs angewiesen sind, müssen Sie sich mit temporären Dateien helfen:
ECHO OFF ECHO 1. Stapeljob (AUFRUF.BAT) SET BEISPIEL= CALL UNTER.BAT IF EXIST BEISPIEL.DAT SET BEISPIEL=BELEGT REM ...
ECHO 2. Stapeljob (UNTER.BAT) IF EXIST BEISPIEL.DAT DEL BEISPIEL.DAT ECHO Beliebige Anweisungen, die je nach Ergebnis ECHO z. B. einen ERRORLEVEL liefern... IF ERRORLEVEL 1 ECHO BELEGT >BEISPIEL.DAT ECHO Zurück zu AUFRUF.BAT...
Name: | CALL.DEB |
Funktion: | Ruft einen Stapeljob als Unterprogramm auf. |
Übersetzung: | DEBUG <CALL.DEB |
Prüfsumme: | 4849 |
Anwendung: | CALL Stapel Parameter |
Einschränkungen: | Änderungen des Environments mit »SET« werdennicht übernommen. Der Speicherplatzbedarf be- trägt rund 4,5 KByte (für CALL.COM und eine Kopie von COMMAND.COM). |
A MOV BX,18 ;100 MOV AH,4A ;103 INT 21 ;105 JB 12C ;107 MOV ES,[2C] ;109 XOR DI,DI ;10D CLD ;10F MOV CX,8000 ;110 MOV AL,0 ;113 ES:CMP AL,[DI] ;115 JZ 12C ;118 PUSH CX ;11A PUSH DI ;11B MOV SI,15E ;11C MOV CX,8 ;11F REPZ CMPSB ;122 JZ 131 ;124 POP DI ;126 POP CX ;127 REPNZ SCASB ;128 JZ 115 ;12A MOV AX,4CFF ;12C INT 21 ;12F MOV BL,[80] ;131 ADD BL,2 ;135 MOV [7E],BL ;138 MOV Wo[7F],432F ;13C MOV [16A],CS ;142 PUSH ES ;146 POP DS ;147 CS:MOV ES,[16A] ;148 MOV DX,DI ;14D MOV BX,166 ;14F MOV AX,4B00 ;152 INT 21 ;155 MOV AX,4C00 ;157 SBB AL,0 ;15A INT 21 ;15C DB "COMSPEC=",0,0,7E,0 RCX 6A NCALL.COM W Q
Quelle: 200 Utilities für PC-/MS-DOS von Gerhard Schild und Thomas Jannot