franc
Goto Top

BATCH - IF-Abfrage funktioniert nicht

Hallo,

auf einem Vista 64 prof Rechner versuche ich gerade eine simple Batchdatei zu erstellen, aber die Syntax wird mir nicht angenommen:

xcopy C:\test.bat x:\test.bat
@echo %ERRORLEVEL%
IF %ERRRLEVEL% == 4 GOTO ERR
IF %ERRRLEVEL% == 0 GOTO END
:ERR
echo ERR
:END
echo END

Das Ziel X: ... gibt es nicht, also wird ERRORLEVEL 4 erzeugt. Die Ausgabe ist aber solches:

c:\>xcopy C:\test.bat x:\test.bat
Ungültige Laufwerkangabe
0 Datei(en) kopiert
4
"GOTO" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
c:\>IF == 4 GOTO ERR

Warum geht das GOTO so nicht?
Warum funktioniert das "==" hier denn nicht? Oder auch kein GTR geht.

Was mache ich falsch?

Danke.

Content-Key: 170858

Url: https://administrator.de/contentid/170858

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: Skyemugen
Skyemugen 03.08.2011 um 10:05:01 Uhr
Goto Top
Aloha

... was bitte ist %ERRRLEVEL%?

greetz André
Mitglied: bastla
bastla 03.08.2011 um 10:54:39 Uhr
Goto Top
@Skyemugen
... was bitte ist %ERRRLEVEL%?
Könnte etwa Sinnvolles sein, wenn davor ein
set %ERRRLEVEL%=%ERRORLEVEL%
verwendet wird face-wink (konserviert den Errorlevel des "xcopy") ...

Ansonsten würde ich aber auch eher
xcopy C:\test.bat x:\test.bat && goto :END
verwenden und danach, wenn's denn überhaupt erforderlich ist, den Errorlevel - und dann aber per
if errorlevel 4 goto :ERR
if errorlevel 3 ...
...
- auswerten.

Grüße
bastla
Mitglied: Skyemugen
Skyemugen 03.08.2011 um 11:04:01 Uhr
Goto Top
Aloha bastla,

hm, dem letzten Vorschlag möchte ich widersprechen: (das wenn unbedingt erforderlich)

Wenn man if %errorlevel%==4 verwendet, ist es genau der Wert, den man angibt, im Gegensatz zu if errorlevel 4, wo der Wert mindestens dem entspricht, den man angibt, was bedeutet, dass if errorlevel 0 bei E4 ebenso gültig ist, während if %errorlevel%==0 ungültig ist, da hier nicht nach mindestens abgefragt wird.

greetz André
Mitglied: bastla
bastla 03.08.2011 um 11:17:22 Uhr
Goto Top
Hallo Skyemugen!
if errorlevel 0
wirst Du von mir nie als Vorschlag finden, da (wie Du richtig siehst) unsinnig ...

Der Aufbau sollte daher, wie dargestellt, mit dem höchsten zu prüfenden Wert (hier als Annahme "4") beginnen und dann absteigend die weiteren interessierenden Errorlevel abfragen.

Den Fall "Errorlevel=0" habe ich außerdem schon vorweg per "&&" abgehandelt.

Grüße
bastla

P.S.: Das "wenn unbedingt erforderlich" bezog sich nur darauf, ob der Errorlevel noch genauer ausgewertet werden soll, oder ob es nicht bereits genügt, dass (irgend) ein Fehler gemeldet wurde ...
Mitglied: Skyemugen
Skyemugen 03.08.2011 um 11:27:21 Uhr
Goto Top
Aloha bastla,

gut E0 war ein dummes Beispiel, da ich jedoch nahe dem EP bleiben wollte, wollte ich nur noch einmal klarmachen, dass die beiden Varianten eben unterschiedlich arbeiten und wenn man nicht jeden einzelnen E-Level abfragen bzw. definieren will aber sagen wir für den Fall E2 und E4 etwas angeben will, man nicht mit dem mindestens-Wert arbeiten sollte.

Gut, das war ein wenig an der hiesigen Situation vorbei aber mir war heute mal so, das nebenbei erwähnt zu haben. face-wink ist ja auch eine unterschwellige Information an den TE

greetz André
Mitglied: bastla
bastla 03.08.2011 um 11:37:00 Uhr
Goto Top
Hallo Skyemugen!

Wenn franc
für den Fall E2 und E4 etwas angeben will
dann wäre tatsächlich das Zwischenspeichern des Errorlevels und die gezielte Abfrage eine vernünftige Vorgangsweise (es muss ja nicht unbedingt "ERRRLEVEL" als Variablenname verwendet werden face-wink) ...

Grüße
bastla
Mitglied: franc
franc 03.08.2011 um 11:52:45 Uhr
Goto Top
Zitat von @Skyemugen:
... was bitte ist %ERRRLEVEL%?


SOWASS!!!
Peinlich. Klar, jetzt geht's.

face-smile

Danke.
Mitglied: franc
franc 03.08.2011 um 12:07:53 Uhr
Goto Top
Zur Klärung was ich will:

Ich kopiere mit Roboterkopie ein paar Verzeichnisse auf einen Netzwerkspeicher.
Es soll (mit Blatt.exe) eine Fehlermeldung gemailt werden, falls irgendetwas nicht funktioniert hatte, also wenn der ERRRLEVEL größer als 0 ist.

Danke der Erklärung des Unterschieds zwischen "if errorlevel 4" und "IF %ERRORLEVEL% == 4".
"if errorlevel 4" entspricht somit "IF %ERRORLEVEL% LEQ 4"

siehe:
http://de.wikibooks.org/wiki/Batch-Programmierung:_Batch-Befehle
Mitglied: bastla
bastla 03.08.2011 um 12:12:51 Uhr
Goto Top
Hallo franc!
"if errorlevel 4" entspricht somit "IF %ERRORLEVEL% LEQ 4"
Nope - es wäre
IF %ERRORLEVEL% GEQ 4
- abgesehen davon war ich oben schon davon ausgegangen, dass Du nur zwischen "Fehler" und "kein Fehler" unterscheiden wolltest, und das lässt sich am einfachsten so realisieren:
xcopy C:\test.bat x:\test.bat && goto :END || goto :ERR
(wobei ein "goto" auch schon genügen könnte) ..

Grüße
bastla
Mitglied: Skyemugen
Skyemugen 03.08.2011 um 12:13:28 Uhr
Goto Top
Zitat von @franc:
"if errorlevel 4" entspricht somit "IF %ERRORLEVEL% LEQ 4"

Nö, eigentlich umgekehrt: geq - denn es entspricht mindestens nicht höchstens face-wink

greetz André

edit: too late ^_^
Mitglied: franc
franc 03.08.2011 um 12:29:50 Uhr
Goto Top
Zitat von @bastla:
...
xcopy C:\test.bat x:\test.bat && goto END || goto ERR
> 
...

Ich habe mehrere robocopy Befehle. Also wäre das dann so?

robocopy C:\test1 X:\test1 || goto ERR
robocopy C:\test2 X:\test2 || goto ERR

goto END

:ERR
blat blabla

:END
ende
Mitglied: bastla
bastla 03.08.2011 um 13:37:46 Uhr
Goto Top
Hallo franc!

Oder so:
robocopy C:\test1 X:\test1 || (set "Quelle=test1" & goto ERR )  
...
:ERR
blat Fehler bei Sicherung von %Quelle% blabla
...
oder
set "Fehler="  
for %%i in ("test1" "test2" "test3") do call :Sichern "%%i"  
if defined Fehler blat Fehler bei %Fehler% ...
goto :eof

:Sichern
robocopy "C:\%~1" "X:\%~1" && goto :eof  
set "Fehler=%Fehler%_%1  
goto :eof
Grüße
bastla
Mitglied: franc
franc 03.08.2011 um 14:07:25 Uhr
Goto Top
Danke an alle.
Es klappt jetzt.
Zwar ganz primitiv, also nur wenn E0 dann mail:ok, wenn E>0 dann Mail:error