Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Errorlevel wird in for-Schleife (Windows Batch) nicht gesetzt?

Frage Entwicklung Batch & Shell

Mitglied: Bierfreund

Bierfreund (Level 1) - Jetzt verbinden

28.06.2006, aktualisiert 20:59 Uhr, 11825 Aufrufe, 4 Kommentare

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:
01.
@echo off 
02.
set WinRarExec=D:\WinRAR\rar.exe 
03.
echo ---------------------- 
04.
echo : Einzelverarbeitung : 
05.
echo ---------------------- 
06.
echo. 
07.
echo Verarbeite 1test_ok.rar... 
08.
%WinRarExec% -idc x 1test_ok.rar .\Einzelverarbeitung\1test_ok\ 
09.
 
10.
echo --- 
11.
echo Errorlevel: %ERRORLEVEL% 
12.
echo --- 
13.
if %ERRORLEVEL% EQU 0 (echo Kein Fehler 
14.
                       echo weiterverarbeitung, del Datei) 
15.
if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht) 
16.
echo. 
17.
echo Verarbeite 2test_fehler.rar... 
18.
%WinRarExec% -idc x 2test_fehler.rar .\Einzelverarbeitung\2test_fehler\ 
19.
 
20.
echo --- 
21.
echo Errorlevel: %ERRORLEVEL% 
22.
echo --- 
23.
echo. 
24.
if %ERRORLEVEL% EQU 0 (echo Kein Fehler 
25.
                       echo weiterverarbeitung, del Datei) 
26.
if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht) 
27.
echo. 
28.
echo ---------------- 
29.
echo : for-Schleife : 
30.
echo ---------------- 
31.
echo. 
32.
for /f %%i in ('dir /b *.rar') do ( 
33.
	echo Verarbeite %%i... 
34.
	%WinRarExec% -idc x %%i .\Schleife\%%~ni\ 
35.
 
36.
	echo --- 
37.
	echo Errorlevel: %ERRORLEVEL% 
38.
	echo --- 
39.
	if %ERRORLEVEL% EQU 0 (echo Kein Fehler 
40.
                               echo weiterverarbeitung, del %%i) 
41.
	if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht) 
42.
	echo. 
43.
44.
pause
Und hier die Ausgabe bei der Ausführung:
01.
---------------------- 
02.
: Einzelverarbeitung : 
03.
---------------------- 
04.
 
05.
Verarbeite 1test_ok.rar... 
06.
 
07.
 
08.
Extracting from 1test_ok.rar 
09.
 
10.
Creating    .\Einzelverarbeitung                                            OK 
11.
Creating    .\Einzelverarbeitung\1test_ok                             OK 
12.
Extracting  .\Einzelverarbeitung\1test_ok\test.txt                OK 
13.
All OK 
14.
--- 
15.
Errorlevel: 0 
16.
--- 
17.
Kein Fehler 
18.
weiterverarbeitung, del Datei 
19.
 
20.
Verarbeite 2test_fehler.rar... 
21.
 
22.
 
23.
Extracting from 2test_fehler.rar 
24.
 
25.
Creating    .\Einzelverarbeitung\2test_fehler                        OK 
26.
Extracting  .\Einzelverarbeitung\2test_fehler\test.txt           99% 
27.
test.txt             - CRC failed 
28.
Unexpected end of archive 
29.
Total errors: 2 
30.
--- 
31.
Errorlevel: 3 
32.
--- 
33.
 
34.
Fehler, Datei wird nicht geloescht 
35.
 
36.
---------------- 
37.
: for-Schleife : 
38.
---------------- 
39.
 
40.
Verarbeite 1test_ok.rar... 
41.
 
42.
 
43.
Extracting from 1test_ok.rar 
44.
 
45.
Creating    .\Schleife                                                               OK 
46.
Creating    .\Schleife\1test_ok                                                OK 
47.
Extracting  .\Schleife\1test_ok\test.txt                                   OK 
48.
All OK 
49.
--- 
50.
Errorlevel: 3 
51.
--- 
52.
Fehler, Datei wird nicht geloescht 
53.
 
54.
Verarbeite 2test_fehler.rar... 
55.
 
56.
 
57.
Extracting from 2test_fehler.rar 
58.
 
59.
Creating    .\Schleife\2test_fehler                                          OK 
60.
Extracting  .\Schleife\2test_fehler\test.txt                             99% 
61.
test.txt             - CRC failed 
62.
Unexpected end of archive 
63.
Total errors: 2 
64.
--- 
65.
Errorlevel: 3 
66.
--- 
67.
Fehler, Datei wird nicht geloescht 
68.
 
69.
Drücken Sie eine beliebige Taste . . .
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!
Mitglied: Biber
28.06.2006 um 09:33 Uhr
Moin Bierfreund,

ist eine Art optischer Täuschung, der Du aufgesessen bist.

Diese Sequenz...
01.
... 
02.
echo. 
03.
for /f %%i in ('dir /b *.rar') do ( 
04.
    echo Verarbeite %%i... 
05.
    %WinRarExec% -idc x %%i .\Schleife\%%~ni 
06.
    echo --- 
07.
    echo Errorlevel: %ERRORLEVEL% 
08.
    echo --- 
09.
    if %ERRORLEVEL% EQU 0 (echo Kein Fehler 
10.
                               echo weiterverarbeitung, del %%i) 
11.
    if %ERRORLEVEL% NEQ 0 (echo Fehler, Datei wird nicht geloescht) 
12.
    echo. 
13.
14.
....
..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:
01.
... 
02.
echo. 
03.
Setlocal EnableDelayedExpansion 
04.
for /f %%i in ('dir /b *.rar') do ( 
05.
    echo Verarbeite %%i... 
06.
    %WinRarExec% -idc x %%i .\Schleife\%%~ni 
07.
    echo --- 
08.
    echo Errorlevel: !ERRORLEVEL! 
09.
    echo --- 
10.
    if !ERRORLEVEL! EQU 0 (echo Kein Fehler 
11.
                               echo weiterverarbeitung, del %%i) 
12.
    if !ERRORLEVEL! NEQ 0 (echo Fehler, Datei wird nicht geloescht) 
13.
    echo. 
14.
15.
..

Grüße
Biber
Bitte warten ..
Mitglied: Bierfreund
28.06.2006 um 13:56 Uhr
OK, Danke funktioniert super!
Bin zwar aus den anderen Beiträgen im Forum auch nicht so richtig schlau geworden, was dieses "setlocal EnableDelayedExpansion" genau macht, aber Hauptsache es funktioniert erstmal!
Bitte warten ..
Mitglied: Bierfreund
28.06.2006 um 14:27 Uhr
Also, mich hat das ganze nicht in Ruhe gelassen, ich verwende einfach nicht gerne etwas, dass ich nicht verstanden habe. In der Hilfe von set (set /?) habe ich eine Erklärung gefunden, die ich ziemlich gut finde, jetzt verstehe ich es auch. Ich poste es deshalb mal:
01.
Die verzögerte Erweiterung von Variablen verbessert die Möglichkeiten der 
02.
Variablenerweiterung. Bisher wurden die Variablen beim Lesen des Texts, und 
03.
nicht bei dessen Ausführung, erweitert. Das folgende Beispiel zeigt ein 
04.
Problem, das dabei auftritt: 
05.
 
06.
    set VAR=vorher 
07.
    if "%VAR%" == "vorher" ( 
08.
        set VAR=nachher; 
09.
        if "%VAR%" == "nachher" @echo Es funktioniert! 
10.
11.
 
12.
Die Meldung würde nie angezeigt, weil %VAR% in beiden IF-Befehlen 
13.
beim Lesen des ersten IF-Befehls erweitert wird, weil es logisch zu diesem 
14.
gehört. Daher vergleicht der zweite IF-Befehl "vorher" mit "nachher" was nie 
15.
gleich sein kann. Auch das folgende Beispiel funktioniert nicht wie erwartet: 
16.
 
17.
    set LISTE= 
18.
    for %i in (*) do set LISTE=%LISTE% %i 
19.
    echo %LISTE% 
20.
 
21.
Es wird KEINE Liste der Dateien im aktuellen Verzeichnis erstellt, stattdessen 
22.
erhält LISTE den Namen der letzten Datei als Wert. Dies ist der Fall, weil 
23.
%LISTE% nur einmal beim Lesen des IF-Befehls erweitert wird. Zu diesem 
24.
Zeitpunkt ist LISTE leer. 
25.
Die FOR-Schleife, die tatsächlich ausgeführt wird, lautet: 
26.
 
27.
    for %i in (*) do set LISTE= %i 
28.
 
29.
Hiermit wird der Variablen LISTE immer wieder der letzte Dateiname 
30.
zugewiesen. 
31.
 
32.
Die verzögerte Erweiterung von Umgebungsvariablen erlaubt es, eine 
33.
Umgebungsvariable, unter Verwendung eines weiteren Zeichens (dem 
34.
Ausrufezeichen), zur Laufzeit zu erweitern. Mit aktivierter verzögerter 
35.
Erweiterung von Umgebungsvariablen können obige Beispiele wie folgt geschrieben 
36.
werden: 
37.
 
38.
    set VAR=vorher 
39.
    if "%VAR%" == "vorher" ( 
40.
        set VAR=nachher 
41.
        if "!VAR!" == "nachher" @echo Es funktioniert! 
42.
43.
 
44.
    set LISTE= 
45.
    for %i in (*) do set LISTE=!LISTE! %i 
46.
    echo %LISTE% 
47.
 
48.
Wenn die Befehlserweiterungen aktiviert sind, gibt es mehrere dynamische 
49.
Umgebungsvariablen, die zwar erweiterungsfähig sind, aber nicht in der Liste 
50.
von Variablen auftauchen, die mit SET angezeigt werden. Diese Variablenwerte 
51.
werden bei jeder Werterweiterung der Variable dynamisch berechnet. Falls eine 
52.
Variable mit einem dieser Namen definiert wird, dann überschreibt diese 
53.
Definition die unten stehende dynamische Definition: 
54.
 
55.
%CD% - expandiert zum aktuellen Verzeichnisnamen. 
56.
 
57.
%DATE% - expandiert zum aktuellen Datum unter Verwendung desselben Formats 
58.
    wie der DATE-Befehl. 
59.
 
60.
%TIME% - expandiert zur aktuellen Zeit unter Verwendung desselben Formats 
61.
    wie der TIME-Befehl. 
62.
 
63.
%RANDOM% - expandiert zu einer zufällig gewählten Dezimalzahl 
64.
    zwischen 0 und 32767. 
65.
 
66.
%ERRORLEVEL% - expandiert zum aktuellen ERRORLEVEL-Wert. 
67.
 
68.
%CMDEXTVERSION% - expandiert zur Versionsnummer der aktuellen Erweiterungen 
69.
    für den Befehlsinterpreter. 
70.
 
71.
%CMDCMDLINE% - expandiert zur ursprünglichen Befehlszeile, die den 
72.
    Befehlsinterpreter aufgerufen hat.
Allerdings hätte ich auch gleich nochmal eine Frage:
Um die DelayedExpansion zu aktivieren gibt es mehrere Möglichkeiten:
1. Durch die Zeile "setlocal EnableDelayedExpansion" im Batch
2. Permanent in der Registry durch setzen des Keys "DelayedExpansion" REG_DWORD 0x1 unter HKEY_CURRENT_USER\Software\Microsoft\Command Processor bzw. HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
3. Durch Aufrufen von cmd.exe mit dem Schalter /V:On

Ich arbeite sehr oft mit cmd.exe /u damit ist es möglich bei Umleitungen in Dateien Umlaute zu erhalten (zb. bei Umleitung von dir, dass Dateien mit Umlauten enthält). cmd.exe /u bewirkt die Ausgabe interner Befehle in eine Pipe oder Datei im UNICODE-Format.
Gibt es eine Möglichkeit die Verwendung des UNICODE-Formats durch cmd.exe auch permanent über die Registry bzw eine Zeile im Batch zu aktivieren?
Bitte warten ..
Mitglied: Biber
28.06.2006 um 20:59 Uhr
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:
01.
set VAR=vorher 
02.
    if "%VAR%" == "vorher" ( 
03.
        set VAR=nachher; 
04.
        if "%VAR%" == "nachher" @echo Es funktioniert! 
05.
    )
... 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...
01.
@echo off & Setlocal EnableDelayedExpansion 
02.
    set VAR=vorher 
03.
    if "%VAR%" == "vorher" ( 
04.
        set VAR=nachher 
05.
        if "!VAR!" == "nachher" @echo Es funktioniert! 
06.
    )
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:
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(4)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Probleme mit Dateipfaden in for-Schleife (1)

Frage von Jonas1806 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Schleife als FOR-SCHLEIFE (2)

Frage von mp2711 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (17)

Frage von Unwichtig zum Thema Netzwerkmanagement ...