soundinle
Goto Top

Batch-Datei zeigt erfolgreiches Ereignis als Fehler an

Hallo zusammen face-smile

Habe hier eine Batch-Datei gebastelt, die automatisch einen Ordner erstellt und eine vorhandene Datei in diesen kopiert. Falls irgendwo ein Fehler auftaucht, soll zu "Fehler" gesprungen und auf eine Benutzereingabe gewartet werden. Doch das Erfolgreiche Kopieren wird als Fehler deklariert. Wo ist der Fehler? Hier die Batch:

@echo off
if errorlevel 1 goto Fehler
S:
if errorlevel 1 goto Fehler
md Temp
if errorlevel 1 goto Fehler
move S:\Backup.7z S:\Temp
if errorlevel 1 goto Fehler
:Fehler
echo FEHLER!!! FEHLER!!! FEHLER!!!
pause

Freue mich auf Antworten face-smile

Content-Key: 258722

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

Printed on: April 24, 2024 at 19:04 o'clock

Mitglied: 114757
Solution 114757 Dec 30, 2014 updated at 22:48:19 (UTC)
Goto Top
Moin,
dir fehlt ein goto Sprung vor dem Fehlerabschnitt face-wink, da dieser ansonsten auch bei Erfolg abgearbeitet wird! Batch überspringt ja nicht von selbst einen Abschnitt...
goto ende
:Fehler
echo FEHLER!!! FEHLER!!! FEHLER!!!
pause
:ende
Gruß jodel32
Member: rubberman
rubberman Dec 30, 2014 at 22:50:42 (UTC)
Goto Top
Hallo.

Und falls GOTO irgendwann mal langweilig werden sollte (leider wohl nicht mehr zu Lebzeiten von Batch face-sad) ...
@echo off &setlocal
cd /d "S:\" && md "Temp" && move "Backup.7z" "Temp\" && exit /b  
echo Fehler
pause
Grüße
rubberman
Member: soundinle
soundinle Dec 30, 2014 at 22:50:51 (UTC)
Goto Top
Danke für deine Antwort. Das war sie! Da versuche ich ewig rum - auch mit Sprüngen zu "End", habe aber nicht kapiert, dass der Rest immer trotzdem berücksichtigt wird. Danke!

Ich habe die folgende, andere, Batch nun nach diesem Muster umgebaut. Sie löscht den Ordner (nach dem Backup) wieder. Doch sie meckert gar nicht, wenn kein Ordner vorhanden ist und dieser schon gelöscht wurde:

@echo off
if errorlevel 1 goto Fehler
S:
if errorlevel 1 goto Fehler
rd /s /q S:\Temp
if errorlevel 1 goto Fehler
goto Ende
:Fehler
echo FEHLER!!! FEHLER!!! FEHLER!!! FEHLER!!! FEHR!!!
pause
:Ende
exit

Vom Code her ist doch alles richtig?
Member: rubberman
Solution rubberman Dec 30, 2014, updated at Dec 31, 2014 at 16:43:35 (UTC)
Goto Top
Hallo soundinle.

Ob ein Errorlevelwert gesetzt wird, bzw. welcher, hängt davon ab, ob die Entwickler diese Logik implementiert haben. Im Fall von RD haben sie offensichtlich gepennt und der Errorlevel bleibt 0.
Workaround:
rd /s /q S:\Temp 2>&1 | findstr . && goto Fehler

Grüße
rubberman
Member: soundinle
soundinle Dec 31, 2014 at 00:58:11 (UTC)
Goto Top
Super! Funktioniert! Jetzt kommt die Meldung, dass das System die angegebene Datei nicht finden kann! Doch vielleicht könntest du mir diesen Code erklären? Ich habe herausgefunden, dass && so viel heißt wie "wenn Befehl erfolgreich, dann ...". Doch eigentlich wird ja zu "Fehler" gesprungen, wenn der Befehl eben nicht erfolgreich war. Wie ist das Problem im Beispiel gelöst?
Member: rubberman
Solution rubberman Dec 31, 2014 updated at 16:43:27 (UTC)
Goto Top
Doch vielleicht könntest du mir diesen Code erklären?
RD gibt keine Meldung aus, wenn das Löschen erfolgreich ist. Anderenfalls wird eine Fehlermeldung zu StdErr (Stream 2) geschrieben. Der lässt sich aber nicht per Pipe (|) an einen anderen Befehl übergeben. Darum ist es nötig StdErr mit dem leeren StdOut (Stream 1) zu vereinen. Das passiert mittels 2>&1. Das heißt, der FINDSTR Befehl wird über die Pipe gestartet. Dieser detektiert nun, was bei ihm ankommt. Wenn irgend ein Zeichen (das bedeutet der Punkt hinter FINDSTR) gefunden wurde, dann ist FINDSTR erfolgreich und setzt Errorlevel 0. Wurde kein Zeichen gefunden (was der Fall ist, wenn es keine Fehlermeldung gab) ist FINDSTR nicht erfolgreich und der Errorlevel wird auf 1 gesetzt. So kommt die umgekehrte Logik zustande.

Grüße
rubberman
Member: soundinle
soundinle Dec 31, 2014 at 16:43:10 (UTC)
Goto Top
Super, danke für deine Erklärung, auch wenn ich nicht alles verstehe (ich kenne nur die "Standardsachen"). Aber so läuft es optimal face-smile

Guten Rutsch euch allen!

Soundinle