Wie kann man mit Batch "call"-Parameter / Variablen übergeben und in der ausgeführten Datei einlesen?

3 Antworten

CALL kann auf zwei verschiedene Arten benutzt werden. Zum Einen um externe ausführbare Dateien aufzurufen und zum Anderen um einen Abschnitt innerhalb des Batch-Scripts wie eine Prozedur aufzurufen.

Der externe CALL-Befehl kann selbst eigentlich weg gelassen werden.

z.B. sind folgende Befehle gleich:

CALL notepad.exe MeinText.txt
notepad.exe MeinText.txt

Mit internen Variablen geht das natürlich auch (derselbe Befehl):

SET myVar=MeinText.txt
CALL notepad.exe %myVar%

Der interne CALL-Befehl kann aber nicht weggelassen werden und die Syntax ist auch ein wenig anders:

@echo off
SETLOCAL

SET myVar=MeinText.txt
CALL :mySection "%myVar%"
GOTO :eof

:mySection
CALL notepad.exe "%~1"
GOTO :eof

Hier wird wieder dieselbe Funktion aufgerufen, aber auf eine sehr strukturierte Art.

Der erste CALL-Befehl ruft die eigene Batch erneut auf (CALL "%~0") und springt aber gleich zu der definierten Sprungmarke ":mySection" – weshalb der Doppelpunkt unbedingt erforderlich ist – und beendet diesen Aufruf beim ersten EXIT-Befehl, der hierbei durch den Befehl "GOTO :eof" gleichbedeutend ersetzt wird.

Die Sprungmarke ":eof" ist intern vordefiniert, muss daher nicht angegeben werden und bedeutet "end of file", also "gehe zum Ende der Datei".

D.h., dass der erste CALL-Befehl zu :mySection springt, dann weiter läuft, bis zum letzten GOTO-Befehl, dann zurück nach dem ersten CALL-Befehl und dann also beim ersten GOTO-Befehl wieder weiter macht, bzw. hier das Script beendet.

Der erste "GOTO :eof"-Befehl ist erforderlich, da das Skript sonst einfach weiter laufen würde und den ":mySection"-Abschnitt erneut durchlaufen würde.

Anstatt "GOTO :eof" kann man beim internen CALL-Aufruf aber nicht
den EXIT-Befehl nehmen, da sonst das Script insgesamt – also auch der
Aufrufende Prozess – beendet werden würde. Hier muss man unterscheiden
zwischen dem CMD-internen EXIT und dem EXIT-Befehl.
Klingt aber nur auf den ersten Blick kompliziert ;)

Im Section-CALL werden die übergebenen Parameter ganz normal, wie bei einem Befehlszeilen-Aufruf abgefragt – also mit %1, %2, etc.

Noch Fragen? Gerne.

CLI:
some-command admin password

Script:
set arg1=%1
set arg2=%2
some-command /u %arg1% /p %arg2%