Ein CALL für alle DOS-Versionen

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