eras 10 Geschrieben 25. Juni 2010 Melden Teilen Geschrieben 25. Juni 2010 Hey, ich hab da ein kleines Problem. Hab da ein Batchfile das ein Programm startet und bei auftreten eines Fehlers den Errorlevel in ein Logfile schreiben soll. Nun funktionieren die if/else abfrage völlig problemlos (er verhält sich immer richtig) aber wenn ein Fehler auftritt, schreibt er in das Logfile IMMER den Returncode 0 rein?! Prüfe hier irgendwas... if ERRORLEVEL 0 ( Starte Programm XY if ERRORLEVEL 0 ( echo OK ) else ( echo Fehler: %errorlevel% >> %logfile% ) ) else ( echo Fehler: nicht gefunden ) Zitieren Link zu diesem Kommentar
tesso 375 Geschrieben 25. Juni 2010 Melden Teilen Geschrieben 25. Juni 2010 Ich vermute das das der errlovel vom echo ist. Warum schreibst du nicht prophylaktisch gleich nach starteprogramm den Errorcode in eine Variable. Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 25. Juni 2010 Melden Teilen Geschrieben 25. Juni 2010 "if ERRORLEVEL x" prüft in Wirklichkeit ob "ERRORLEVEL => x" ist. If not ERRORLEVEL 1 ( ... ) else ( echo Fehler: nicht gefunden ) müsste m.E. -allerdings ungetestet- funktionieren cu blub Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 26. Juni 2010 Melden Teilen Geschrieben 26. Juni 2010 Der Errorlevel lässt sich nur 1x abfragen und wird dann auf 0 gesetzt. Der Errorlevel bei der 1. Abfrage in einer Variable speichern und mit der weiterarbeiten. -Zahni Zitieren Link zu diesem Kommentar
eras 10 Geschrieben 28. Juni 2010 Autor Melden Teilen Geschrieben 28. Juni 2010 (bearbeitet) Das geht nicht: ProgrammXY set returncode=%errorlevel% @blub Die IF / ELSE Struktur funktioniert übrigens (wie ich ober schon geschrieben habe). D.h. in der Richtung brauche ich eh keine Lösung, die Lösung die ich brauche ist, dass ich den Rückgabewert von Programm XY brauche um ihn ins Logfile zu schreiben. Und irgendwie muss der ja auch zu bekommen sein, denn sonst würde auch die IF / ELSE Struktur nicht so fehlerfrei funktionieren wie sie es jetzt tut. Trotzdem habe ich ein paar Änderungen vorgenommen die wohl nötig waren: find <irgendwas> if not %ERRORLEVEL%==0 ( echo Fehler: nicht gefunden ) else ( Starte Programm XY if not ERRORLEVEL == 0 ( echo Fehler: %errorlevel% >> logfile ) else ( echo OK ) ) Wie gesagt, die IF / ELSE Struktur funktioniert einwandfrei, wenn bei Programm XY ein Fehler auftritt oder kein Fehler auftritt, dann springt er auch in die richtige Verarbeitung. Nur in %errorlevel% scheint immer der Rückgabewert von 'find' zu stehen. bearbeitet 28. Juni 2010 von eras Zitieren Link zu diesem Kommentar
pdietrich 10 Geschrieben 28. Juni 2010 Melden Teilen Geschrieben 28. Juni 2010 Hallo, so sollte es gehen: [color="Red"][b]setlocal enabledelayedexpansion[/b][/color] find <irgendwas> if not %ERRORLEVEL%==0 ( echo Fehler: nicht gefunden ) else ( Starte Programm XY [color="red"][b]Set Err=!Errorlevel![/b][/color] if not [color="red"][b]!ERR![/b][/color] == 0 ( echo Fehler: [color="red"][b]!err![/b][/color] >> logfile ) else ( echo OK ) ) mfg Peter Zitieren Link zu diesem Kommentar
eras 10 Geschrieben 28. Juni 2010 Autor Melden Teilen Geschrieben 28. Juni 2010 Hey klasse, das funktioniert, vielen Dank! :) Kannst du mir vielleicht kurz erklären was da passiert? Zitieren Link zu diesem Kommentar
pdietrich 10 Geschrieben 28. Juni 2010 Melden Teilen Geschrieben 28. Juni 2010 Hallo eras. Errorlevel kann nur einmal zuverlässig direkt nach dem Ereignis abgefragt werden. Deshalb wird der Errorlevel der Variablen "Err" zugewiesen. Da in einer For Schleife Variablen nicht bei jedem "Durchlauf" erneut eingelesen werden steht hier noch immer der Errorlevel des ersten Find drin. Um das zu ändern muss die "Verzögerte Variablenerweiterung" eingeschaltet werden. Dadurch wird jedesmal wenn eine Variable innnerhalb "!" steht der Inhalt neu aktualisiert. Also wird der Errorlevel des 2. Programms übernommen. cmd /? und evtl. setlocal /? geben weitere Hinweise. Ich hoffe das war einigermaßen verständlich. mfg Peter Zitieren Link zu diesem Kommentar
eras 10 Geschrieben 29. Juni 2010 Autor Melden Teilen Geschrieben 29. Juni 2010 Ok, aber das verstehe ich dabei nicht ganz: Da in einer For Schleife Variablen nicht bei jedem "Durchlauf" erneut eingelesen werden Bei dem ganzen verwende ich ja keine For Schleife? Zitieren Link zu diesem Kommentar
pdietrich 10 Geschrieben 29. Juni 2010 Melden Teilen Geschrieben 29. Juni 2010 Ja OK. Aber mit ( und ) ist das auch so. Er nimmt die Variablen am Anfang und aktualisiert sie nicht mehr innerhalb des Blocks. D.h. wenn innerhalb Variablen geändert werden, wie hier der 2. Errorlevel muss das ! zum Einsatz kommen. !Errorlevel! = damit nicht vom Find sondern aktuell vom Programm der Errorlevel der Err Variablen zugewiesen wird. Und dann natürlich !Err! damit der soeben zugewiesene Wert aktuell geholt wird. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.