
37414
06.12.2020, aktualisiert um 17:09:59 Uhr
Robocopy - Problem mit echo-Anzeigen, Pausen und goto
Hallo mal wieder.
Ich habe bezüglich Robocopy schon einige Threads hier erstellt.
Das heutige Problem war auch schon mal innerhalb eines anderen Threads angesprochen worden, aber hier ist es einfach spezieller. Daher nochmal meine Nachfrage.
Ich habe eine Batch-Datei erstellt, die ein Menü öffnet, über das ich über die Eingabe unterschiedlicher Zahlen, unterschiedliche Batch-Unterprogramme starten kann.
Das funktioniert grds. sehr gut.
Eines dieser Batch-Unterprogramme kopiert mehrere Dateien, die in lokalen Unterverzeichnissen liegen, auf eine externe Festplatte... und dort wiederum in entsprechende Verzeichnisse/Unterverzeichnisse.
Hier mal der Code dieser Batch:
Hier habe ich jetzt alle REM-Einträge entfernt, damit es nicht so lang wird.
Nun zeige ich Euch mal, wie diese Batch optisch abläuft, nachdem ich sie gestartet habe:
1) Screenshot nach Start der Batchdatei:
2) Screenshot nachdem die Batchdatei durchgelaufen ist:
Wie Ihr seht, unterscheidet sich die Anzeige auf den Screenshots sehr von dem Inhalt der Batchdatei.
Beispiel:
Ab Zeile 56 der Batch steht folgendes:
...eigentlich müßte die Batch dann warten, bis ich ENTER gedrückt habe. Sie läuft aber auch so schon an.
Im Screenshot 2 sieht man, dass z.B. folgende Meldung (ab Batchzeile 77) überhaupt nicht angezeigt wird:
Weiterhin wird über "der Kopiervorgang läuft" eine Meldung angezeigt --> "ECHO ist ausgeschaltet (OFF)".
Woher die kommt... keine Ahnung.
Folgende Meldung aus der Batchdatei (Zeile 106) wird ebenfalls nicht angezeigt (siehe Screenshot 2):
Und am Ende werden 2 Reihen Sternchen angezeigt (siehe Screenshot 2) und darunter steht
"Die Sicherung wird mit ENTER beendet".
Das jedoch steht schon viel weiter oben... nämlich in Zeile 92 der Batchdatei:
Ist alles etwas kompliziert, das ist mir bewußt. Aber ich verstehe einfach diese unterschiedlichen Reaktionen nicht.
Ich vermute mal, dass ich irgendwo Fehler gemacht habe bei den Pause-Eingaben oder bei den Sprüngen "goto".
Wäre schön, wenn Ihr mir weiterhelfen könntet.
Danke und schöne Grüße,
imebro
Ich habe bezüglich Robocopy schon einige Threads hier erstellt.
Das heutige Problem war auch schon mal innerhalb eines anderen Threads angesprochen worden, aber hier ist es einfach spezieller. Daher nochmal meine Nachfrage.
Ich habe eine Batch-Datei erstellt, die ein Menü öffnet, über das ich über die Eingabe unterschiedlicher Zahlen, unterschiedliche Batch-Unterprogramme starten kann.
Das funktioniert grds. sehr gut.
Eines dieser Batch-Unterprogramme kopiert mehrere Dateien, die in lokalen Unterverzeichnissen liegen, auf eine externe Festplatte... und dort wiederum in entsprechende Verzeichnisse/Unterverzeichnisse.
Hier mal der Code dieser Batch:
@ echo off &setlocal enabledelayedexpansion
echo.
CHCP 1252
color 9F
mode con lines=41 cols=172
echo.
echo ============================================================
echo.
echo D A T E N S I C H E R U N G!
echo.
echo - Backup E vom Laptop nach Backup G auf ext. FP -
echo.
echo ============================================================
echo Heute ist der %date:~0% - %time:~0,5% Uhr
echo.
echo ^(c^) MeinName / %date:~-4%
echo ============================================================
echo.
echo.
echo es werden folgende Verzeichnisse gesichert:
echo "E:\Backups lokal\“
echo "E:\FritzBox"
echo "E:\IMAGES"
echo "E:\Backup_SD-Karte“
echo.
echo.
set Quelle="E:"
set Ziel="G:"
set Logfile="D:\Desktop\BACKUP\Robocopy-Logs\E_nach_G_LOG.txt"
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"
CHOICE /N /C JN /M "a%BS% Hat die Ziel-FP den LW-Buchstaben %Ziel%? --> (J)a, (N)ein: "
if errorlevel 2 goto :PAUSE
if errorlevel 1 goto :WEITER
:PAUSE
echo.
echo.
echo.
echo. Das LW in der Datentraegerverwaltung (über "Computerverwaltung") zunaechst auf G einstellen... dann ENTER!
pause > NUL
set "excludes="
for /f "usebackq delims=" %%a in ("E:\excludes.txt") do set excludes=!excludes! /XD "%%a"
echo Ausgeschlossene Verzeichnisse: %excludes%
:WEITER
echo.
echo.
echo. ********************************
echo. * Sicherung starten = ENTER... *
echo. ********************************
echo.
pause > NUL
echo.
REM -------------------Beginn des Sicherungs-Codes-------------------------------------------------------------------------------------
robocopy %Quelle% %Ziel% /MIR /ETA /DST /MT:50 /R:3 /W:10 /L %excludes% /LOG:%Logfile% > Nul
REM -------------------Ende des Sicherungs-Codes----------------------------------------------------------------------------------------
echo
echo. *****************************
echo. * Der Kopiervorgang läuft!! *
echo. *****************************
if errorlevel 2 goto :FEHLER
echo.
echo. *************************************
echo. * Der Kopiervorgang war erfolgreich *
echo. *************************************
@echo ^G
echo. Weiter mit ENTER
pause > NUL
goto :FRAGE
:FEHLER
echo.
echo.
echo. *********************************************************
echo. * F E H L E R >> Der Kopiervorgang ist fehlgeschlagen!! *
echo. *********************************************************
echo.
echo. Die Sicherung wird mit ENTER beendet
pause > NUL
goto ENDE
:FRAGE
REM mit CLS den Bildschirm löschen (also alles, was bis hierher ausgegeben wurde!)
CLS
echo.
echo.
echo.
echo.
CHOICE /N /C JN /M "a%BS% Soll das Logfile geöffnet werden? --> (J)a, (N)ein: "
if errorlevel 2 goto :PAUSE2
if errorlevel 1 goto :WEITER2
:PAUSE2
echo.
echo.
echo. ********************************
echo. * Sicherung beenden = ENTER... *
echo. ********************************
echo.
pause > NUL
goto ENDE
:WEITER2
start notepad %Logfile%
echo.
echo.
echo. Das Logfile wurde gestartet
echo.
echo.
echo. ********************************
echo. * Sicherung beenden = ENTER... *
echo. ********************************
echo.
pause > NUL
:ENDE
exit /b
Hier habe ich jetzt alle REM-Einträge entfernt, damit es nicht so lang wird.
Nun zeige ich Euch mal, wie diese Batch optisch abläuft, nachdem ich sie gestartet habe:
1) Screenshot nach Start der Batchdatei:
2) Screenshot nachdem die Batchdatei durchgelaufen ist:
Wie Ihr seht, unterscheidet sich die Anzeige auf den Screenshots sehr von dem Inhalt der Batchdatei.
Beispiel:
Ab Zeile 56 der Batch steht folgendes:
echo. ********************************
echo. * Sicherung starten = ENTER... *
echo. ********************************
echo.
pause > NUL
...eigentlich müßte die Batch dann warten, bis ich ENTER gedrückt habe. Sie läuft aber auch so schon an.
Im Screenshot 2 sieht man, dass z.B. folgende Meldung (ab Batchzeile 77) überhaupt nicht angezeigt wird:
echo. *************************************
echo. * Der Kopiervorgang war erfolgreich *
echo. *************************************
@echo ^G
echo. Weiter mit ENTER
pause > NUL
goto :FRAGE
Weiterhin wird über "der Kopiervorgang läuft" eine Meldung angezeigt --> "ECHO ist ausgeschaltet (OFF)".
Woher die kommt... keine Ahnung.
Folgende Meldung aus der Batchdatei (Zeile 106) wird ebenfalls nicht angezeigt (siehe Screenshot 2):
CHOICE /N /C JN /M "a%BS% Soll das Logfile geöffnet werden? --> (J)a, (N)ein: "
Und am Ende werden 2 Reihen Sternchen angezeigt (siehe Screenshot 2) und darunter steht
"Die Sicherung wird mit ENTER beendet".
Das jedoch steht schon viel weiter oben... nämlich in Zeile 92 der Batchdatei:
echo. Die Sicherung wird mit ENTER beendet
pause > NUL
goto ENDE
Ist alles etwas kompliziert, das ist mir bewußt. Aber ich verstehe einfach diese unterschiedlichen Reaktionen nicht.
Ich vermute mal, dass ich irgendwo Fehler gemacht habe bei den Pause-Eingaben oder bei den Sprüngen "goto".
Wäre schön, wenn Ihr mir weiterhelfen könntet.
Danke und schöne Grüße,
imebro
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 629160
Url: https://administrator.de/forum/robocopy-problem-mit-echo-anzeigen-pausen-und-goto-629160.html
Ausgedruckt am: 12.04.2025 um 10:04 Uhr
19 Kommentare
Neuester Kommentar
Weiterhin wird über "der Kopiervorgang läuft" eine Meldung angezeigt --> "ECHO ist ausgeschaltet (OFF)".
Punkt hinter echo vergessen.Was deine anderen Fehler angeht
- prüf mal ob das Script mit Windows Zeilenumbrüchen gespeichert wurde, da sonst deine GOTOs sonstwo landen
- Stell sicher dass du keine F- oder Pfeiltasten verwendest wenn du auf PAUSE reagierst, sonst bleibt der eigentliche Keycode im stdin stehen und wird bei einem weiteren Aufruf von PAUSE gelesen was dazu führt dass nicht auf Eingabe gewartet wird.
Die Zeit die du seit Jahren noch in Batch investierst, hätte sich längst ausgezahlt, wenn du dich statt dessen mit der PowerShell beschäftigt hättest. (... auch wenn ich weiß dass du dahingehend beratungsresistent bist.)
Steffen
Nabend,
auf die Schnelle nur das hier:
Zeile 1: @ echo off &setlocal enabledelayedexpansion
und dann
Zeile 69ff:
Gruß
cykes
P.S. Zu spät
auf die Schnelle nur das hier:
Zitat von @37414:
Weiterhin wird über "der Kopiervorgang läuft" eine Meldung angezeigt --> "ECHO ist ausgeschaltet (OFF)".
Woher die kommt... keine Ahnung.
Works as designed, würde ich sagen:Weiterhin wird über "der Kopiervorgang läuft" eine Meldung angezeigt --> "ECHO ist ausgeschaltet (OFF)".
Woher die kommt... keine Ahnung.
Zeile 1: @ echo off &setlocal enabledelayedexpansion
und dann
Zeile 69ff:
echo
echo. *
echo. * Der Kopiervorgang läuft!! *
echo. *
Entweder nimmt Du in Zeile 69: echo. für eine Leerzeile oder schaltest echo ein (wobei Du vermutlich nur den . vergessen hast)echo. *
echo. * Der Kopiervorgang läuft!! *
echo. *
Gruß
cykes
P.S. Zu spät
Zitat von @37414:
Was meinst Du mit den Windows Zeilenumbrüchen?
Was meinst Du mit den Windows Zeilenumbrüchen?
Unter Windows besteht ein Zeilenumbruch aus den beiden Zeichen Carriage Return und Line Feed. Diverse Editoren erlauben aber Einstellungen, sodass auch ein einzelnes Line Feed (wie unter Linux üblich) als Zeilenumbruch verwendet werden kann.
Wenn du dir unsicher bist, kann ein HEX Editor Aufschluss geben. 0D 0A ist was du am Zeilenende benötigst. Findest du nur 0A dann bringst du die CMD bei Sprüngen im Script ordentlich durcheinander.
Steffen

set "Quelle=D:\Desktop"
set "Ziel=E:\Test"
set "Dateien=aaa.mp4 Flower.jpg"
set "Optionen=/MIR /ETA /DST /MT:50 /R:3 /W:10"
set "Logfile=D:\Desktop\BACKUP\Robocopy-Logs\TEST.txt"
robocopy "%Quelle%" "%Ziel%" %Dateien% %Optionen% /LOG+:%Logfile% >NUL

Zitat von @37414:
Aber es wurden auch sämtliche anderen Verzeichnisse vom Desktop nach "E:\Test" kopiert.
Naja wenn du /MIR benutzt kein Wunder ... Einfach mal das Handbuch lesen bevor man sich wundert!Aber es wurden auch sämtliche anderen Verzeichnisse vom Desktop nach "E:\Test" kopiert.
Witzig ist, dass ich gerade auch %Dateien% noch in Anführungsstriche gesetzt habe testweise.
Nicht witzig, sondern falsch weil es dann keine zwei Dateifilter sind sondern nur einer.... Ergo Batch Handbuch lesen.
Müssen bei der SET-Angabe eigentlich immer die vollständigen Zeilen in Anführungsstriche gestellt werden?
Muss nicht, aber das ist Best-Practice, Je nachdem wo du nämlich die Anführungszeichen setzt müssen sie bei der Verwendung an der Stelle wo du die Variablen verwendest entweder zusätzlich gesetzt werden oder eben nicht. Bei dem umklammern von dem ganzen Set-Ausdruck stellst du sicher das alles was hinter dem Gleichheitszeichen kommt als ein String als ganzes behandelt wird und zusätzlich bestimmte Sonderzeichen nicht escaped werden müssen.Vergleiche:
set "Quelle=D:\Desktop"
dir "%Quelle%"
set Quelle="D:\Desktop"
dir %Quelle%

Bei dieser Variante hätte man es beim eigentlichen Kopierbefehl einfacher, da nichts in Anführungsstriche gesetzt werden muss.
Doch, dein Logfile hast du vergessen Ist wahrscheinlich am Ende Geschmackssache oder Gewöhnung
Konsistenz über alle Skripte hinweg sollte das Ziel sein, sonst stellt an sich selbst immer mal wieder ein Bein mit Leerzeichen in Pfaden. Deswegen setze ich grundsätzlich auch dort Anführungszeichen wo sie auch sonst immer hingehören. Die Variante verwirrt im Allgemeinen weniger.
Zitat von @37414:
hmmm... das Logfile steht doch in meinem Code mit drin - und auch ohne Anführungsstriche, wie Du es ja weiter oben auch gepostet hattest
Nee du hast das wohl falsch gelesen oder interpretiert ... trotzdem müssen unten bei der Verwendung noch Anführungszeichen um den Pfad weil du beim Set für den Logfile-Pfad den ganzen Ausdruck in Anführungszeichen gesetzt hast!hmmm... das Logfile steht doch in meinem Code mit drin - und auch ohne Anführungsstriche, wie Du es ja weiter oben auch gepostet hattest
Guckst du
https://stackoverflow.com/questions/535975/dealing-with-quotes-in-window ...
Und
https://ss64.com/nt/set.html
Lesen und verstehen:
It is good practice to avoid using any delimiter characters (spaces, commas etc) in the variable name.
Delimiter characters can be used in the value if the complete assignment is surrounded with double quotes to prevent the delimiter being interpreted.
Any extra spaces around either the variable name or the string, will not be ignored, SET is not forgiving of extra spaces like many other scripting languages. So use SET alpha=beta, not SET alpha = beta
Aber eine Frage habe ich dennoch:
In meiner Original-Datei, die ja eine große Datenmenge kopiert, bzw. spiegelt, habe ich ja in den Code eingebaut
"Kopiervorgang läuft"
und weiter unten dann
"Kopiervorgang war erfolgreich"
Dort stoppt der Ablauf dann nochmal durch ein
"pause > NUL"
Gibt es irgendeine Möglichkeit, dass der Text "Kopiervorgang läuft" so lange stehen bleibt, bis der Kopiervorgang TATSÄCHLICH zu Ende ist und dass dann erst die Meldung "Kopiervorgang war erfolgreich" auftaucht?
Ich bin hier jetzt raus, artet mal wieder zur Montags Batch-Grundlagen-Fragestunde aus.

Zitat von @37414:
Sorry, aber ich muss Dir bezüglich Logfile doch widersprechen:
Ich habe nämlich mit dem folgenden Code jetzt völlig korrekt die beiden Dateien nach "E:\Test" kopiert... und das OHNE Logfile im Kopierbefehl in Anführungsstriche zu setzen:
So lange natürlich keine Leerzeichen im Pfad sind logisch, erst wenn du mal Leerzeichen im Pfad hast werden die relevant, genau dafür sind die ja in erster Linie da! Also einfach mal kurz nachdenken vor dem Schreiben und widersprechen Sorry, aber ich muss Dir bezüglich Logfile doch widersprechen:
Ich habe nämlich mit dem folgenden Code jetzt völlig korrekt die beiden Dateien nach "E:\Test" kopiert... und das OHNE Logfile im Kopierbefehl in Anführungsstriche zu setzen:
Was Du mit "ist per Default so" meinst, ist mir auch nicht klar.
Aber offensichtlich hast Du ja eh keine Lust mehr, hier weiter zu schreiben... schade
Du musst nur die Links oben lesen und das Kommentare von Kollege @rubberman Aber offensichtlich hast Du ja eh keine Lust mehr, hier weiter zu schreiben... schade
Genau für solche Fragen ist ein solches Forum nämlich da.
Klar ist es das aber das man jeden Thread zu einer Frage mit x Fragen zu anderen Themen vollpfopft hilft niemandem der hier anschließend vorbei kommt und eine Antwort auf seine Frage sucht. Aber scheint in deinen Threads ja usus zu sein, unter 50 Antworten geht da wohl nix.Und dieser ständige Hinweis auf Handbücher etc. ist im Grunde ein NoGo in einem Forum.
Blödsinn, man muss nur wissen wo man nachschlagen muss dann ist ein Forum nämlich überflüssig! Und als Neuling wäre ich dankbar wenn mir jemand zeigt wo ich selbst nachschlagen kann wenn ich etwas nicht verstehe! Oder lässt du dir etwa jedes mal von neuem von deiner Mutter zeigen wie man sich den A... abwischt wenn du auf das stille Örtchen gehst?Dennoch danke für Deine gute Hilfe!!
Bidde.Tschö.