MS-DOS Forum

MS-DOS Forum
Anleitungen, Referenz aller DOS Befehle, Batch Dateien
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    MS-DOS Forum Foren-Übersicht -> Batch Programmierung
Autor
Nachricht
matthias





Bedingungen mit einer IF Abfrage in Batch Dateien
Verfasst am: 14.05.2009, 11:14

Bedingungen werden durch IF-Ausdruecke formuliert. DOS bietet
drei Varianten:
IF [not] exist <Datei-Ausdruck>
IF [not] errorlevel <n>
IF [not] <Wort1>==<Wort2>

Nach einer Bedingung kann jede beliebige BAT-Anweisung stehen,
z.B. ein GOTO, ein DOS-Befehl oder ein Programm-Aufruf.
Die Anweisung wird nur ausgefuehrt, wenn die Bedingung WAHR ist.
Das optionale NOT bedarf wohl keiner weiteren Erklaerung.
Da IF EXIST am einfachsten zu handhaben ist, soll zunaechst mal
mit diesem Ausdruck begonnen werden. Beispiele:
IF exist TEST.BAK del TEST.BAK
IF NOT exist TEST.DAT goto WEITER
IF EXIST liefert WAHR, wenn die betreffende Datei existiert.
Dabei koennen auch die Jokerzeichen "?" und "*" verwendet werden,
und natuerlich sind Laufwerk- und Pfadangaben erlaubt.
IF EXIST C:\TEMP\*.* (irgendeine Datei in C:\TEMP ?)

Ungueltige Datei-Angaben

Bei Ungueltigen Datei-Angaben oder Pfaden gilt die Datei als NICHT
vorhanden. Es gibt also keine Fehlermeldung.

Verzeichnis Vorhanden?

Das Vorhandensein eines Verzeichnisses kann nicht direkt festgestellt
werden, da DOS nur nach Dateinamen sucht. Man koennte
zwar pruefen, ob Dateien im gewuenschten Verzeichnis sind, aber
damit wird ein evtl. leeres Verzeichnis nicht festgestelt.
Es gibt jedoch eine einfache Abhilfe: man sucht nach NUL.
NUL ist ein spezielles Geraet, das zwar nicht vorhanden, aber
ueberall definiert ist.
IF EXIST C:\TEMP\NUL
Dieser Ausdruck ist nur dann WAHR, wenn der Pfad C:\TEMP gueltig
ist, egal ob Dateien vorhanden sind oder nicht.
UND-Verknuepfung

Nach einer Bedingung koennen weitere Bedingungen in der selben
Zeile folgen. Das entspricht einer UND-Verknuepfung. Beispiel:
IF exist TEST.BAK if not EXIST TEST.NEU ren TEST.BAK TEST.NEU

Variabler Datei-Ausdruck

Mit IF exist koennen auch variable Angaben ueberprueft werden:
IF NOT exist %1 ECHO %1 ist nicht vorhanden
Allerdings sollte man sichergehen, dass der angegebene Befehlsparameter
nicht leer ist, denn dann bekaeme DOS folgende Zeile
zu lesen:
IF NOT exist ECHO ist nicht vorhanden
Da die Datei ECHO vermutlich nicht existiert, fuehrt DOS den
Befehl "ist" aus, sofern ein solches Programm vorhanden ist.
Andernfalls Fehler: "Befehl oder Dateiname nicht gefunden".
Dieses Problem besteht bei allen IF-Ausdruecken mit Variablen,
weil DOS den variablen Wert bereits VOR der Interpretation der
Zeile einsetzt. Bei leeren Variablen kommt so die gesamte Syntax
des Befehls durcheinander. Haeufigste Fehlermeldung daher:
"Syntax-Fehler".
Nicht vorhandene (leere) Variable bzw. Befehlsparameter lassen
sich mit der Vergleichsbedingung feststellen.

IF Wort1==Wort2

Wenn zwei Woerter verglichen werden sollen, so macht dies nur
Sinn, wenn mindestens eines davon eine Variable ist, also ein
Befehlsparameter oder eine "Umgebungsvariable". Hier soll es
zunaechst nur um Befehlsparameter gehen. (Bei Umgebungsvariablen
gibt es zusaetzliche Komplikationen, weil sie z.B. Leerzeichen
und Sonderzeichen enthalten koennen.)
Beispiel: IF %1==A: GOTO WEITER
Achtung: DOS besteht auf dem doppelten "=". Sonst Syntax-Fehler!
Leerzeichen vor und hinter den Gleich-Zeichen sind erlaubt.
Gross-/Kleinschreibung wird unterschieden. Wenn also im obigen
Beispiel "a:" als Befehlsparameter angegeben wurde, ist die
Bedingung NICHT wahr. Da hilft nur eines: beide Moeglichkeiten
abfragen.

Leere Parameter

Bei der IF EXIST Abfrage wurde schon gezeigt, dass leere Befehlsparameter
die Syntax durcheinander bringen.
Beispiel: IF %1 == A: GOTO WEITER
ergibt: IF == A: GOTO WEITER (wenn %1 leer)
Resultat: "Syntax-Fehler".
Die Loesung des Problems: Man erweitert beide Seiten der Gleichung
einfach um das selbe Zeichen.
Beispiel: IF %1x == A:x GOTO WEITER
ergibt: IF x == A:x GOTO WEITER (wenn %1 leer)
Zu diesem Zweck kann man beliebige Buchstaben verwenden, auch
Sonderzeichen, ausgenommen Trennzeichen wie Komma, Semikolon,
da diese ebenso wie Leerzeichen ignoriert werden. Eine gute Wahl
sind z.B. Anfuehrungszeichen. (Sie haben im BATCH nicht die sonst
uebliche Bedeutung, sondern werden wie Buchstaben behandelt.)
Beispiel: IF "%1" == "A:" GOTO WEITER
ergibt: IF "" == "A:" GOTO WEITER (wenn %1 leer)
Jetzt ist auch klar, wie man leere Parameter abfragt:
Beispiel: IF %1x == x ECHO Bitte Laufwerk angeben!
oder: IF "%1" == "" ECHO Bitte Laufwerk angeben!
Fazit:
Bei IF-Abfragen immer die hier beschriebenen Verfahren anwenden,
sofern auch nur die geringste Moeglichkeit besteht, dass Variable
bzw. Befehlsparameter leer sein koennten.

Noch ein Tipp:

Angenommen man moechte sicherstellen, dass die Befehlsparameter
%2 und %3 leer sind. Das koennte so aussehen (UND-Verknuepfung):
IF "%2"=="" IF "%3"=="" goto OK
Einfacher geht's so:
IF "%2%3"=="" goto OK

IF ERRORLEVEL n

Jedes Programm, das zum Beenden die empfohlene DOS-Funktion 4C
benutzt, gibt einen RETURN-Code ("Beendigungscode") an COMMAND.COM
bzw. an das aufrufende Programm zurueck. Dieser Return-Code ist
ein Byte und kann daher die Werte 0...255 haben.
Um diesen Return-Code zu interpretieren, muss man natuerlich
wissen, welche Werte fuer welchen Fall von dem berteffenden
Programm vorgesehen sind. In den meisten Faellen wird der Return-
Code benutzt, um mitzuteilen, ob ein Fehler aufgetreten ist:
Null bedeutet "Programm ordnungsgemaess beendet", jeder andere
Wert signalisiert einen Fehler. Wenn es "leichte" und "schwere"
Fehler gibt, kann das Programm verschiedene Codes verwenden: je
hoeher um so schwerwiegender der Fehler.
Auf dieser Basis wurde die IF ERRORLEVEL... Abfrage im BATCH
konzipiert:
IF ERRORLEVEL n
bedeutet: IF Return-Code >= n
So kann man mit einer einzigen Abfrage (IF ERRORLEVEL 1) feststellen,
ob ueberhaupt ein Fehler aufgetreten ist, ohne dass alle
anderen (moeglicherweise gelieferten) Codes abgefragt werden
muessen.
Bei allen ERRORLEVEL-Abfragen muss man sich also der "groesser/
gleich"-Logik bewusst sein. Wenn auf verschiedene Return-Codes
reagiert werden soll, ist (bei Verwendung von GOTO) eine Abfrage
in absteigender Folge erforderlich.
Beispiel: Ein Programm kann die Return-Codes 0,1,3 und 9 zurueckgeben.
Dann lautet die Abfrage:
IF errorlevel 9 goto Label-9
IF errorlevel 3 goto Label-3
IF errorlevel 1 goto Label-1
:: hier ist errorlevel 0
Uebrigens:
Die Abfrage "IF [not] ERRORLEVEL 0 goto ..." ist absolut witzlos,
denn groesser oder gleich Null ist der Return-Code IMMER. Um nur
den Return-Code 0 abzufragen verwendet man logischerweise:
IF not errorlevel 1 goto ...
Soll nur ein ganz bestimmter Code abgefangen werden, z.B. 100,
dann geht das so:
IF errorlevel 100 IF NOT errorlevel 101 goto ....
Noch ein Hinweis:
Der Return-Code kann nur in dieser IF ERRORLEVEL Konstruktion
angesprochen werden. Eine *direkte* Verwendung des Wertes
(z.B. als Variable) ist nicht ohne weiteres moeglich.

Andere Verwendung des Return-Codes

Ein Programm kann natuerlich den Return-Code auch fuer andere
Zwecke als nur fuer Fehler verwenden. Z.B. kann ein Mailer mit
bestimmten Codes mitteilen, was gerade anliegt. Auf jeden Fall
muss vereinbart sein, welche Codes fuer welchen Zweck verwendet
werden. Dafuer gibt es keinerlei allgemeine Regeln.

DOS-Befehle

DOS-Befehle, also in COMMAND.COM integrierte Befehle ohne eigene
Programmdatei, geben - soweit feststellbar - ueberhaupt keinen
Return-Code zurueck. Auch nicht Null: der zuletzt produzierte
Return-Code bleibt erhalten! Wer also auf die Idee kommt, z.B.
nach COPY oder MD den ERRORLEVEL abzufragen, wird sich wundern!

Sonstige DOS-Gemeinheiten

Wo man vielleicht einen Return-Code erwarten sollte, geben DOSProgramme
moeglicherweise generell Null zurueck, z.B. beim Datei-
Vergleich. Also: zur Nutzung der ERRORLEVEL-Abfrage ist eine
genaue Kenntnis der vom Programm uebergebenen Werte unumgaenglich.
Fuer einige DOS-Programme finden sich die Beendigungscodes im
DOS-Handbuch, fuer andere gibt es jedoch keine Angaben, auch in
Faellen, in denen Return-Codes tatsaechlich produziert werden.
_________________
 
Neues Thema eröffnen   Neue Antwort erstellen    MS-DOS Forum Foren-Übersicht -> Batch Programmierung

Tags: exist abfrage, batch, dos

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Der Befehl Restore funktioniert nicht 2454 08.12.2008, 07:39
Keine neuen Beiträge Der Befehl Undelete funktioniert nicht 3475 01.12.2008, 08:32
Keine neuen Beiträge eine gelöschte MS-DOS Datei wiederherstellen 6562 09.11.2008, 10:47
Keine neuen Beiträge Ein Programm benutzt nicht den XMS-Erweiterungsspeicher 2728 25.11.2008, 08:50
Keine neuen Beiträge Ein Programm meldet, dass die MS-DOS-Version falsch ist 1904 16.11.2008, 10:59
 



[ Time: 0.9100s ][ Queries: 58 (0.0317s) ][ GZIP on - Debug on ]