Errorlevel wird in for-Schleife (Windows Batch) nicht gesetzt?
Hallo,
ich möchte mir einen Batch schreiben, der alle .rar-Dateien eines Ordners entpackt, falls kein Fehler auftritt eine Weiterverarbeitung durchführt und die entsprechende .rar-Datei löscht. Ich bin dabei allerdings auf das Problem gestossen, dass der Errorlevel in meiner for-Schleife nicht gesetzt wird.
Zum Testen habe ich mir mal eine fehlerfreie (1test_ok.rar) und eine fehlerhafte (2test_fehler.rar) .rar-Datei plus ein Testskript, das die Dateien zuerst einzeln verarbeitet und anschließend in der for-Schleife. Ich werde daraus allerdings nicht schlau.
Hier zuerstmal der code des Testskriptes:
Und hier die Ausgabe bei der Ausführung:
Wie man sehen kann, funktioniert bei der Einzelverarbeitung alles wie gewünscht, dir rar.exe (Kommandozeilentool von Winrar) setzt bei der fehlerfreien .rar-Datei den Errorlevel auf 0, bei der fehlerhaften auf 3 (was laut der Winrar Hilfe auch OK ist).
Beim ersten durchlauf der Schleife wird wieder die fehlerfreie .rar-Datei verarbeitet, der Errorlevel bleibt allerdings auf 3, wie auch beim zweiten Schleifendurchlauf. Es sieht also so aus, als wird der Errorlevel in der Schleife nicht verändert.
Ich bin ziemlich ratlos, kann mir jemand weiterhelfen? Wäre sehr dankbar!
ich möchte mir einen Batch schreiben, der alle .rar-Dateien eines Ordners entpackt, falls kein Fehler auftritt eine Weiterverarbeitung durchführt und die entsprechende .rar-Datei löscht. Ich bin dabei allerdings auf das Problem gestossen, dass der Errorlevel in meiner for-Schleife nicht gesetzt wird.
Zum Testen habe ich mir mal eine fehlerfreie (1test_ok.rar) und eine fehlerhafte (2test_fehler.rar) .rar-Datei plus ein Testskript, das die Dateien zuerst einzeln verarbeitet und anschließend in der for-Schleife. Ich werde daraus allerdings nicht schlau.
Hier zuerstmal der code des Testskriptes:
@echo off
set WinRarExec=D:\WinRAR\rar.exe
echo ----------------------
echo : Einzelverarbeitung :
echo ----------------------
echo.
echo Verarbeite 1test_ok.rar...
%WinRarExec% -idc x 1test_ok.rar .\Einzelverarbeitung\1test_ok\
echo ---
echo Errorlevel: %ERRORLEVEL%
echo ---
if %ERRORLEVEL% EQU 0 (echo Kein Fehler
echo weiterverarbeitung, del Datei)
if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht)
echo.
echo Verarbeite 2test_fehler.rar...
%WinRarExec% -idc x 2test_fehler.rar .\Einzelverarbeitung\2test_fehler\
echo ---
echo Errorlevel: %ERRORLEVEL%
echo ---
echo.
if %ERRORLEVEL% EQU 0 (echo Kein Fehler
echo weiterverarbeitung, del Datei)
if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht)
echo.
echo ----------------
echo : for-Schleife :
echo ----------------
echo.
for /f %%i in ('dir /b *.rar') do (
echo Verarbeite %%i...
%WinRarExec% -idc x %%i .\Schleife\%%~ni\
echo ---
echo Errorlevel: %ERRORLEVEL%
echo ---
if %ERRORLEVEL% EQU 0 (echo Kein Fehler
echo weiterverarbeitung, del %%i)
if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht)
echo.
)
pause
----------------------
: Einzelverarbeitung :
----------------------
Verarbeite 1test_ok.rar...
Extracting from 1test_ok.rar
Creating .\Einzelverarbeitung OK
Creating .\Einzelverarbeitung\1test_ok OK
Extracting .\Einzelverarbeitung\1test_ok\test.txt OK
All OK
---
Errorlevel: 0
---
Kein Fehler
weiterverarbeitung, del Datei
Verarbeite 2test_fehler.rar...
Extracting from 2test_fehler.rar
Creating .\Einzelverarbeitung\2test_fehler OK
Extracting .\Einzelverarbeitung\2test_fehler\test.txt 99%
test.txt - CRC failed
Unexpected end of archive
Total errors: 2
---
Errorlevel: 3
---
Fehler, Datei wird nicht geloescht
----------------
: for-Schleife :
----------------
Verarbeite 1test_ok.rar...
Extracting from 1test_ok.rar
Creating .\Schleife OK
Creating .\Schleife\1test_ok OK
Extracting .\Schleife\1test_ok\test.txt OK
All OK
---
Errorlevel: 3
---
Fehler, Datei wird nicht geloescht
Verarbeite 2test_fehler.rar...
Extracting from 2test_fehler.rar
Creating .\Schleife\2test_fehler OK
Extracting .\Schleife\2test_fehler\test.txt 99%
test.txt - CRC failed
Unexpected end of archive
Total errors: 2
---
Errorlevel: 3
---
Fehler, Datei wird nicht geloescht
Drücken Sie eine beliebige Taste . . .
Beim ersten durchlauf der Schleife wird wieder die fehlerfreie .rar-Datei verarbeitet, der Errorlevel bleibt allerdings auf 3, wie auch beim zweiten Schleifendurchlauf. Es sieht also so aus, als wird der Errorlevel in der Schleife nicht verändert.
Ich bin ziemlich ratlos, kann mir jemand weiterhelfen? Wäre sehr dankbar!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 34983
Url: https://administrator.de/contentid/34983
Ausgedruckt am: 23.11.2024 um 04:11 Uhr
4 Kommentare
Neuester Kommentar
Moin Bierfreund,
ist eine Art optischer Täuschung, der Du aufgesessen bist.
Diese Sequenz...
..ist, auch wenn es anders formatiert ist, für den CMD-Interpreter eine Zeile.
Und die dort enthaltenen Variablen werden einmal aufgelöst.
So auch %ErrorLevel%.
Suche mal im Forum nach DelayedExpansion oder "verzögerter Variablenauflösung".
Abhilfe:
Grüße
Biber
ist eine Art optischer Täuschung, der Du aufgesessen bist.
Diese Sequenz...
...
echo.
for /f %%i in ('dir /b *.rar') do (
echo Verarbeite %%i...
%WinRarExec% -idc x %%i .\Schleife\%%~ni
echo ---
echo Errorlevel: %ERRORLEVEL%
echo ---
if %ERRORLEVEL% EQU 0 (echo Kein Fehler
echo weiterverarbeitung, del %%i)
if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht)
echo.
)
....
Und die dort enthaltenen Variablen werden einmal aufgelöst.
So auch %ErrorLevel%.
Suche mal im Forum nach DelayedExpansion oder "verzögerter Variablenauflösung".
Abhilfe:
...
echo.
Setlocal EnableDelayedExpansion
for /f %%i in ('dir /b *.rar') do (
echo Verarbeite %%i...
%WinRarExec% -idc x %%i .\Schleife\%%~ni
echo ---
echo Errorlevel: !ERRORLEVEL!
echo ---
if !ERRORLEVEL! EQU 0 (echo Kein Fehler
echo weiterverarbeitung, del %%i)
if !ERRORLEVEL! NEQ 0 (echo Fehler, Datei wird nicht geloescht)
echo.
)
..
Grüße
Biber
Moin Bierfreund,
erstmal die offene Frage (UNICODE-Output per RegKey einstellen): Nein, geht nicht/gibt es nicht.
Und noch eine Anmerkung zur M$-Hilfe, die ich auch relativ gut finde:
Zwei Schmunzelfehler sind gerade in den beiden "Set VAR=vorher/nachher"-Beispielen.
a) Im ersten Beispiel hat der Verfasser des Textes ganz in Gedanken ein Semikolon angehängt:
... die Variable %VAR% hat dann auch den Wert "nachher;" (in der Zeile nach dem Klammer-Zu natürlich erst)
Hier war der Autor gedanklich wohl noch bei der Java -Programmierung - wo das doch so pfuipfui behandelt wurde im offiziellen M$-Umfeld
b) der zweite Schmunzelbug ist dann, wenn ihr den Code unten mal laufen lasst...
Ausgabe ist ..."Es funktioniert" (ohne Ausrufungszeichen!) ... weil M$ leider vergessen hat, dass nicht immer auf ein Ausrufungszeichen eine [Zitat] "verzögert erweiterte Variable" folgt.
Zum Brüllen ist es, wenn die gut gewollte Zeile so eingetippselt worden wäre:
Na ja... Bill Gates ist trotzdem Millardär geworden.. entweder liegt es am Marketing oder an den Personaleinsparungen bei Qualitätssicherung und MSKB-Übersetzungen..
Gruß
Biber
erstmal die offene Frage (UNICODE-Output per RegKey einstellen): Nein, geht nicht/gibt es nicht.
Und noch eine Anmerkung zur M$-Hilfe, die ich auch relativ gut finde:
Zwei Schmunzelfehler sind gerade in den beiden "Set VAR=vorher/nachher"-Beispielen.
a) Im ersten Beispiel hat der Verfasser des Textes ganz in Gedanken ein Semikolon angehängt:
set VAR=vorher
if "%VAR%" == "vorher" (
set VAR=nachher;
if "%VAR%" == "nachher" @echo Es funktioniert!
)
Hier war der Autor gedanklich wohl noch bei der Java -Programmierung - wo das doch so pfuipfui behandelt wurde im offiziellen M$-Umfeld
b) der zweite Schmunzelbug ist dann, wenn ihr den Code unten mal laufen lasst...
@echo off & Setlocal EnableDelayedExpansion
set VAR=vorher
if "%VAR%" == "vorher" (
set VAR=nachher
if "!VAR!" == "nachher" @echo Es funktioniert!
)
Zum Brüllen ist es, wenn die gut gewollte Zeile so eingetippselt worden wäre:
if "%VAR%" == "nachher" @echo !Es funktioniert!
Kaum zu glauben, aber dann ist der Output:ECHO ist eingeschaltet (ON).
*SichVornKoppKlatscht*Na ja... Bill Gates ist trotzdem Millardär geworden.. entweder liegt es am Marketing oder an den Personaleinsparungen bei Qualitätssicherung und MSKB-Übersetzungen..
Gruß
Biber