|
BATCH - Programmierung
Der Kommandointerpreter COMMAND.COM ist auch ein kleiner
Interpreter einer Programmiersprache. Er kann einfachste kleine Programme abarbeiten, die
in der Regel nur eine Aufzählung von DOS-Kommandos oder Programmaufrufen sind. Diese
Programme werden BATCH-Programme genannt, von engl. batch (Stapel). Im einfachsten
Fall besteht eine BATCH Datei also aus einer Aufzählung von DOS--Befehlen, die dann
hintereinander abgearbeitet werden.
Dateien, die nach den Regeln dieser Sprache erstellt wurden haben .BAT
als vorgeschriebene Endung und sind unter DOS gleich ausführbar wie Programme.
Wenn Sie eine Batchdatei zur Fehlersuche zeilenweise abarbeiten wollen,
so rufen Sie einen zweiten Kommandointerpreter auf, mit dem Parameter /Y und der
abzuarbeitenden Batch-Datei:
COMMAND /Y test.bat
zurück
2.1 Abarbeiten eines Befehls-Stapels
BATCH-Dateien sind reine Textdateien (ASCII) und können mit jedem
beliebigen Editor (z.B. EDIT) erstellt werden. Im einfachsten Fall enthalten sie, wie
schon gesagt, nur mindestens einen DOS-Befehl:
CLS
DIR /p
Damit ist es also leicht möglich, komplizierte Befehle mit vielen
Parametern einfach zugänglich zu machen, ohne sich die Parameter einzeln merken zu
müssen. Um z.B. die Einstellung eines seriellen Druckers mit MODE zu vereinfachen
könnten Sie in eine Datei DRUCKER.BAT schreiben:
MODE COM1 baud=9600 parity=N data=8 stop=1
MODE LPT1=COM1
Somit würde es genügen den Befehl DRUCKER einzugeben, statt
jedesmal die beiden obigen Zeilen.
2.2 Textausgabe mit ECHO
Wenn eine Batch-Datei abgearbeitet wird, so werden auch die darin
enthaltenen Befehle auf dem Bildschirm angezeigt. Diese Eigenschaft ist oft störend und
kann daher aus- und auch wieder eingeschaltet werden. Das geschieht mit dem Befehl ECHO.
Dabei schreiben Sie:
ECHO OFF
um das Echo (die Darstellung des Befehls auf dem Bildschirm)
auszuschalten und
ECHO ON
um es wieder zu aktivieren. Üblicherweise wird das Echo in Batch-Dateien
gleich zu Anfang abgeschaltet. Damit aber der Befehl ECHO OFF nicht selbst
trotzdem dargestellt wird, wird ihm ein Klammeraffe (@) vorgestellt, also:
@ECHO OFF
Der Befehl ECHO wird aber auch benutzt, um beliebige Textausgaben
auf dem Bildschirm erscheinen zu lassen. Dabei wird alles, was hinter einem ECHO
Befehl steht als Textzeile auf dem Schirm abgebildet. (Außer ON und OFF) Dazu ist es
nicht nur möglich, sondern auch geradezu notwendig, das ECHO vorher abzuschalten weil
sonst der Befehl ECHO TEXT und in der nächsten Zeile erst der Text selbst
auf dem Schirm erscheinen würde:
@ECHO OFF
ECHO Das ist eine erste Batchdatei.
...
Ohne jeden Parameter gibt ECHO den jeweiligen Zustand (ON oder
OFF) aus, nicht etwa eine Leerzeile. Um eine Leerzeile auszugeben müssen Sie den ECHO-Befehl
mit direkt folgendem Punkt angeben also
ECHO.
2.3 Anhalten des Ablaufs mit PAUSE
Oft ist es nötig, die Abarbeitung des Programms an einer bestimmten
Stelle anzuhalten um z.B. auf einen Diskettenwechsel zu warten. Das geschieht mit dem
Befehl PAUSE. Dabei wird eine Meldung ausgegeben, die besagt, daß eine Taste
gedrückt werden soll, wenn es weiter gehen soll. Eine Batch Datei, die den Inhalt dreier
Disketten in ein Verzeichnis kopiert könnte also z.B. so aussehen:
@ECHO OFF
ECHO Bitte die erste Diskette einlegen...
PAUSE
COPY a:\*.* c:\VERZ1
ECHO Bitte die zweite Diskette einlegen...
PAUSE
COPY a:\*.* c:\VERZ1
ECHO Bitte die dritte Diskette einlegen...
PAUSE
COPY a:\*.* c:\VERZ1
ECHO Fertig...
2.4 Kommentare
Innerhalb einer Batch-Datei werden Kommentare mit dem Befehl REM
eingeleitet. Zeilen, die mit diesem Befehl beginnen werden vom Kommandointerpreter einfach
ignoriert. Damit ist es nicht nur möglich, einfache Kommentare zum besseren Verständnis
einzufügen, sondern auch einzelne Befehle, die nicht ausgeführt werden sollen
auszuklammern.
zurück
MS-DOS kennt die Möglichkeit, Umgebungsvariablen zu definieren, eins der
bekanntesten Beispiele ist die PATH Variable, in der der Suchpfad angegeben wird, der nach
ausführbaren Dateien durchsucht werden soll. Es gibt mehrere solcher Variablen etwa TEMP,
COMSPEC. Auf diese Variablen kann in einer Batch-Datei zugegriffen werden. Dazu muß der
Variablennamen innerhalb von Prozentzeichen (%) aufgeführt werden:
@ECHO OFF
ECHO Die Pfad Variable PATH enthält die Einträge:
ECHO %PATH%
ECHO Als Kommandointerpreter wird %COMSPEC% benutzt.
Solche Variablen können beliebig gesetzt werden, mit dem Befehl
SET VARIABLE=WERT
werden sie erzeugt, mit einem einfachen SET VARIABLE= werden sie
wieder gelöscht. Sie dürfen auch Leerzeichen enthalten:
@ECHO OFF
SET VAR1=Hallo
SET VAR2=Hans Hugo Häberlein
ECHO %VAR1% %VAR2%
SET VAR1=
SET VAR2=
Vorsicht: Die bereits bestehenden Umgebungsvariablen wie PATH oder
TEMP sollten natürlich nicht gelöscht werden, wenn nicht erwünscht ist, daß sie nach
Ablauf der Batch-Datei weiter gelöscht bleiben.
zurück
Kontrollstrukturen sind Möglchkeiten, den linearen Ablauf einer
Batch-Datei zu verändern. Dazu stehen hier leider nur wenige zur Verfügung, es reicht
aber für die wichtigsten Aufgaben.
4.1 GOTO
Mit dem Befehl GOTO können Sie den Kommandointerpreter dazu
bringen, nicht in der nächsten Zeile mit der Bearbeitung der Datei fortzufahren, sondern
sie befehlen ihm zu einer bestimmten Stelle in der Datei zu springen. Diese Stelle wird
als Marke bezeichnet und mit einem Doppelpunkt und einem Markennamen gebildet. So lassen
sich z.B. Endlosschleifen programmieren:
@ECHO OFF
:Anfang
ECHO in der Schleife
GOTO Anfang
4.2 IF
Mit der IF Anweisung können Sie drei verschiedene Bedingungen
überprüfen, die Existenz einer Datei, die Gleichheit zweier Zeichenketten und den
Rückgabewert des zuletzt gelaufenen DOS-Programms (ERRORLEVEL). Durch das Zufügen eines NOT
können auch die jeweils gegenteiligen Bedingungen Überprüft werden. (Nichtexistenx,
Ungleichheit oder die Tatsache daß ein Programm NICHT mit einem bestimmten Rückgabewert
beendet wurde) In der Regel werden IF-Anweisungen mit dem GOTO Befehl verbunden, sie
können jedoch auch einen einzigen Befehl veranlassen.
4.2.1 Existenz von Dateien überprüfen
Syntax:
IF [NOT] EXIST Dateiname Befehl
Ein Beispiel, das eine Datei nur dann kopiert, wenn sie existiert und
sonst eine Fehlermeldung ausgibt wäre etwa:
@ECHO OFF
IF NOT EXIST test.dat GOTO fehler
COPY test.dat c:\verz1
GOTO ende
:fehler
ECHO Datei TEST.DAT nicht gefunden !
:ende
Tip: Um zu überprüfen, ob ein Verzeichnis existiert, können Sie
einfach die Existenz der Datei NULL in diesem Verzeichnis abfragen. Existiert sie,
so existiert auch das Verzeichnis.
4.2.2 Zeichenkettenvergleich
Syntax:
IF [NOT] "Zeichenkette1"=="Zeichenkette2" Befehl
Hier können zwei Zeichenketten miteinander verglichen werden, beide
sollten immer in doppelten Anführungszeichen stehen. Als Zeichenketten können sowohl
eingetippte Wörter, Umgebungsvariablen (siehe unten) als auch Kommandozeilenparameter
(siehe auch weiter unten) benutzt werden. Ein kurzes Beispiel, das überprüft ob ein
Kommandozeilenparameter eingegeben wurde:
@ECHO OFF
IF "%1"=="" GOTO fehler
...
GOTO ende
:fehler
ECHO Keine Parameter eingegeben...
:ende
4.2.3 ERRORLEVEL überprüfen
Syntax:
IF [NOT] ERRORLEVEL Wert Befehl
Jedes DOS Programm liefert beim Beenden einen Abschluß-Fehlercode. Falls
das Programm fehlerfrei abgelaufen ist, so gibt es meist den Wert 0 zurück, falls es
Fehler gab eine Fehlernummer. (Man kann sich leider bei DOS nicht darauf verlassen) Diese
Fehlernummer kann auch mittels IF-Anweisung abgefragt werden. Wichtig ist, daß
hier immer mit der größten Nummer angefangen wird, weil die IF-Anweisung
komischerweise nicht auf Gleichheit, sondern auf größer oder gleich prüft Ein Beispiel
für diese Anwendung gibt es gleich im nächsten Abschnitt, CHOICE ist nämlich ein
Programm, das sein Ergebnis über den ERRORCODE zurückgibt...
4.3 CHOICE
Um auch so etwas wie ein Menü realisieren zu können, steht der Befehl CHOICE
zur Verfügung. CHOICE erwartet als Parameter einen Satz, der auf dem Bildschirm
ausgegeben wird und eine Aufzählung von Buchstaben, die als Antwort gültig sind. Also
etwa:
@ECHO OFF
CHOICE /C:ABC Drücken sie die A, B oder C Taste...
IF ERRORLEVEL 3 ECHO C eingegeben.
IF ERRORLEVEL 2 ECHO B eingegeben.
IF ERRORLEVEL 1 ECHO A eingegeben.
...
In diesem Fall wird keine andere Taste als A, B oder C anerkannt. Sollten
Sie die Aufzählung der Tasten weglassen, so wird standardmäßig die Auswahl J und N
angenommen (bei englischem DOS natürlich dann Y und N).
Es ist auch möglich, ein Timeout einzustellen und zu definieren, welche
Taste nach einer bestimmten Zeit als gedrückt gelten soll. Dazu ist der Parameter /T
c,nn anzugeben, wobei hier c für die angenommene Taste steht und nn
für die Anzahl der Sekunden, die auf eine Eingabe gewartet werden soll.
Durch Angabe des Parameters /S wird zwischen Groß- und
Kleinschreibung unterschieden.
Der Parameter /N+ unterdrückt die Abfrage, stellt aber den Text
dar.
4.4 FOR
Die FOR-Anweisung arbeitet eine Liste ab, es realisiert eine
Schleife, die so oft durchlaufen wird, wie die Liste Elemente vorweist. Als Liste können
sowohl Dateinamen mit Metazeichen (z.B. *.*) als auch Zeichenketten verwendet werden. Um
sich etwa alle Textdateien im aktuellen Verzeichnis anzuschauen könnten Sie schreiben
@ECHO OFF
FOR %%a IN (*.txt) DO type %%a
Als Variablen müssen Sie immer einbuchstabige Namen wählen, die mit
zwei % Zeichen versehen sind. (Außerhalb von Batch-Dateien genügt ein %)
zurück
5.1 Normale Parameter
Batch-Dateien können, wie alle anderen Programme auch
Kommandozeilenparameter bearbeiten. Diese Parameter werden innerhalb der Datei mit den
Namen %1 bis %9 bezeichnet. Um also etwa eine Batch-Datei zu erstellen, die den Inhalt
einer Diskette in ein bestimmtes Verzeichnis kopiert, könnten Sie schreiben:
@ECHO OFF
ECHO Bitte die Diskette einlegen...
PAUSE
COPY A:\*.* %1
ECHO Fertig.
Würden Sie diese Datei ACOPY.BAT nennen und sie folgendermaßen
aufrufen:
ACOPY C:\VERZ1
so stünde in der Zeile mit dem Kopierbefehl jetzt statt dem %1 der
angegebene Parameter C:\VERZ1 und der Befehl würde also lauten:
...
COPY A:\*.* C:\VERZ1
...
Es sind also genau neun Parameter mit dieser Methode ansprechbar, der
Parameter %0 hat eine Sonderbedeutung, er enthält den Namen der Batch-Datei.
5.2 Mehr als 9 Parameter
Mit einem Trick und dem Befehl SHIFT können auch mehr als neun
Parameter benutzt werden, die können dann aber nicht einzeln mit Nummern angesprochen
werden. SHIFT verschiebt einfach alle Parameter um eins nach links. Das heisst, der
erste Parameter fällt weg, der zweite wird zum ersten, der dritte zum zweiten usw. Damit
sind also auch die Abarbeitung aller Parameter möglich, auch wenn Sie garnicht wissen,
wie viele eigentlich benutzt wurden. Hier ein Beispiel:
Das folgende Programm schreibt alle angegebenen Parameter auf den
Bildschirm, keinen zuviel und aber auch keinen zuwenig...
@ECHO OFF
:anfang
IF "%1"=="" GOTO ende
ECHO %1
SHIFT
GOTO anfang
:ende
So ist es also auch möglich, Programme zu schreiben, die für alle
Parameter das gleiche tun, ohne zu wissen, wieviele es denn sind. Es wird solange immer
nur der erste Parameter ausgewertet, solange es einen ersten Parameter gibt. Nach jedem
Durchgang wird mit SHIFT eine Verschiebung vorgenommen...
Mit CALL können Sie aus einer Batch-Datei heraus andere
Batch-Dateien aufrufen. Machen Sie es einfach ohne Call, so funktioniert zwar der Aufruf
der anderen Batch-Dtei, nach deren Abarbeitung kehrt die Kontrolle nicht mehr zur
aufrufenden Batch-Datei zurück.
zurück
7 Zusammenfassung der Syntax für alle
BATCH-Befehle
Die folgenden Kurzbeschreibungen sind der Online Hilfe von MS-DOS
entnommen und können jederzeit durch die Eingabe BEFEHL /? abgerufen werden.
7.1 ECHO
Zeigt Meldungen an oder schaltet die Befehlsanzeige ein (ON) oder aus
(OFF).
ECHO [ON | OFF]
ECHO [Meldung]
ECHO ohne Parameter zeigt die aktuelle Einstellung der Befehlsanzeige an.
7.2 PAUSE
Hält die Ausführung einer Stapelverarbeitungsdatei an und zeigt
folgende Meldung an:
Eine beliebige Taste drücken, um fortzusetzen
7.3 IF
Verarbeitet Ausdrücke mit Bedingungen in einem
Stapelverarbeitungsprogramm.
IF [NOT] ERRORLEVEL Nummer Befehl
IF [NOT] Zeichenfolge1==Zeichenfolge2 Befehl
IF [NOT] EXIST Dateiname Befehl
| NOT |
Der Befehl soll nur dann ausgeführt werden, wenn die Bedingung nicht
erfüllt ist. |
| ERRORLEVEL Nummer |
Diese Bedingung ist erfüllt, wenn das zuletzt ausgeführte Programm
einen Code größer oder gleich Nummer zurückliefert. |
| Befehl |
Der auszuführende Befehl, falls die Bedingung erfüllt ist. |
| Zeichenfolge1==Zeichenfolge2 |
Diese Bedingung ist erfüllt, falls die Zeichenfolgen übereinstimmen. |
| EXIST Dateiname |
Diese Bedingung ist erfüllt, falls die angegebene Datei existiert. |
7.4 GOTO
Setzt die Ausführung eines Stapelverarbeitungsprogramms an einer Marke
fort.
GOTO Marke
Marke Eine Zeichenfolge als Marke in einem Stapelverarbeitungsprogramm.
Marken stehen allein am Zeilenanfang mit einem vorangestellten
Doppelpunkt.
7.5 FOR
Führt einen Befehl für jede einzelne Datei eines Satzes von Dateien
aus.
FOR %%Variable IN (Satz) DO Befehl [Parameter]
| %%Variable |
Ein ersetzbarer Parameter (bestehend aus einem einzelnen Zeichen). |
| (Satz) |
Ein Satz von mindestens einer Datei. Platzhalter sind zulässig. |
| Befehl |
Befehl, der für jede Datei ausgeführt werden soll. |
| Parameter |
Parameter und Optionen für den angegebenen Befehl. |
7.6 CHOICE
Wartet auf die Auswahl des Benutzers der angezeigten Optionen.
CHOICE [/C[:]Tasten] [/N] [/S] [/T[:]c,nn] [Text]
| /C[:]Tasten |
Angabe der zulässigen Tasten. Standard ist JN. |
| /N |
Keine Anzeige eines ?-Zeichens am Ende der Meldung. |
| /S |
Groß-/Kleinschreibung für Tasten wird beachtet. |
| /T[:]c,nn |
Nach nn Sekunden wird Standardauswahl c ausgeführt. |
| Text |
Meldung, die angezeigt wird. |
ERRORLEVEL ist auf die Position der gedrückten Taste aus der
Tastenauswahl gesetzt.
7.7 SHIFT
Verändert die Position ersetzbarer Parameter in einem
Stapelverarbeitungsprogramm.
SHIFT
7.8 CALL
Ruft ein Stapelverarbeitungsprogramm von einem anderen aus auf.
CALL [Laufwerk:][Pfad]Dateiname [Parameter]
7.9 SET
Setzt oder entfernt MS-DOS-Umgebungsvariablen oder zeigt sie an.
SET [Variable=[Zeichenfolge]]
| Variable |
Der Name der Umgebungsvariable. |
| Zeichenfolge |
Eine Zeichenfolge, die der Variablen zugewiesen werden soll. |
Der Befehl SET ohne Parameter zeigt die derzeitigen Umgebungsvariablen
an.
|