Top-Themen

Aktuelle Themen (A bis Z)

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?

Mitglied: Bierfreund

Bierfreund (Level 1) - Jetzt verbinden

28.06.2006, aktualisiert 20:59 Uhr, 12894 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 ..
Ähnliche Inhalte
Batch & Shell

Abfrage ERRORLEVEL springt aus der FOR Schleife

gelöst Frage von GalindieselBatch & Shell8 Kommentare

Liebe Gemeinde, ich habe eine kleine batch geschrieben, die aus einer liste (IPs) heraus Laufwerke mappen soll, darauf dann ...

Batch & Shell

Win10 ändert den Errorlevel? ( Batch )

gelöst Frage von clragonBatch & Shell12 Kommentare

Hey Leute, Ich habe heute wieder mit Prozessen herumgebastelt, die sich gegenseitig überwachen. Da plötzlich, habe ich einen Fehler. ...

Batch & Shell

Seltsames Verhalten bei Errorlevel abfrage in FOR DO Schleife

gelöst Frage von Kalma73Batch & Shell1 Kommentar

Hallo, ich bin gerade dabei ein Stromausfall Shutdown Script zu schreiben. Habe schon einiges Ausprobiert und mir ist etwas ...

Batch & Shell

Bedeutung von RD Errorlevel 1 und Abweichung von errorlevel Meldungen in Batch und Konsole

Frage von anmelderBatch & Shell11 Kommentare

Ich lösche einen Flashspeicher im Netzwerk mit: Ich habe den Code vor Tagen erfolgreich getestet und er lief mit ...

Neue Wissensbeiträge
Firewall
PfSense 2.5.0 benötigt doch kein AES-NI
Tipp von ChriBo vor 17 StundenFirewall

Hallo, Wie sich einige hier erinnern werden hat Jim Thompson in diesem Aritkel beschrieben, daß ab Version 2.5.0 ein ...

Internet
Copyright-Reform: Upload-Filter
Information von Frank vor 2 TagenInternet

Hallo, viele Menschen reden aktuell von Upload-Filtern. Sie reden darüber, als wären es eine Selbstverständlichkeit, das Upload-Filter den Seitenbetreibern ...

Google Android

Blokada: Tracking und Werbung unter Android unterbinden

Information von AnkhMorpork vor 2 TagenGoogle Android1 Kommentar

In Ergänzung zu meinem vorherigen Beitrag: Blokada efficiently blocks ads, tracking and malware. It saves your data plan, makes ...

Google Android
Facebooks unsichtbare Datensammlung
Information von AnkhMorpork vor 2 TagenGoogle Android2 Kommentare

Rund 30 Prozent aller Apps im Play-Store nehmen Kontakt zu Facebook auf, sobald man sie startet. So erfährt der ...

Heiß diskutierte Inhalte
Linux Userverwaltung
LogIn Versuche beschränken auf EINEN Versuch
gelöst Frage von GarroshLinux Userverwaltung23 Kommentare

Folgendes Problem Ich habe einen dezidierten Server beim Hoster gemietet, installiert ist Ubuntu 18.04.2 LTS‬ und als Webinterface Plesk. ...

Backup
Wo installiert man Veeam bei SoHo?
Frage von EDVMan27Backup14 Kommentare

Hallo, nachdem ich die neue Veeam CE bei mir getestet habe, wollte ich es einmal bei einem Kunden testen. ...

Ubuntu
Exchange Alternative auf Ubuntu
Frage von TELLOUbuntu11 Kommentare

Hi NG, wir müssen für unsere Kleine Firma (5 User) das Email / Kalendersystem neu einrichten. Ich könnte jetzt ...

Batch & Shell
Tasklist überprüfen
Frage von IleiesBatch & Shell10 Kommentare

Hallo zusammen, Wie kann ich in Batch überprüfen, ob gerade der Prozess "Skype.exe" ausgeführt wird? Also nicht so dass ...