Batch: Einmaliges Kopieren mit Robocopy und Log abgleich
Ich bin gerade dabei eine Batchdatei zu erweitern, was aber scheinbar nicht so einfach ist wie gedacht.
Es geht darum einen Ordner Inhalt immer wieder zu kopieren (Loop), wobei der Ordnername bestehend aus 5 zahlen sich öfters ändert.
Nun wollte ich das bereits Kopierte (immer unterschiedliche Verzeichnisse) in einer Logdatei festhalten und beim erneuten Durchgang mit
der Logdatei vergleichen bzw. bereits vorhandene ausschließen.
Problem ist jetzt, das er "%%A" nicht finden kann.
Was mir grad noch aufgefallen ist, das das Erstellen der Logdatei so wie ich es jetzt habe nicht viel sin macht.
Wenn beim Kopieren ein neuer Ordner rein kommt, wird er wohlmöglich vor dem kopieren mit ins log geschrieben oder?
Man könnte, das Logfile ja auch von robocopy Erstellen lassen, aber da wird das auswerten sicher schwieriger.
Ich bin dankbar für jede Hilfe.
Es geht darum einen Ordner Inhalt immer wieder zu kopieren (Loop), wobei der Ordnername bestehend aus 5 zahlen sich öfters ändert.
Nun wollte ich das bereits Kopierte (immer unterschiedliche Verzeichnisse) in einer Logdatei festhalten und beim erneuten Durchgang mit
der Logdatei vergleichen bzw. bereits vorhandene ausschließen.
Problem ist jetzt, das er "%%A" nicht finden kann.
set kopi="F:\ordner1\ordner2\"
set blacklist="F:\B-List.log"
pushd %kopi%
For /f "delims=" %%A in ('Dir /B/AD ????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9]$"') do for /f "usebackq tokens=*" %%D in (%blacklist%) do (
If NOT "!dirs!"=="" (
Set dirs=!dirs! "%%D"
) Else (
Set dirs="%%D"
)
)
robocopy "%%A" "E:\ordner3" /S /XD !dirs!
set kopi="F:\ordner1\ordner2\"
pushd %kopi%
Dir /AD /S /B > "F:\B-List.log"
PAUSE
Was mir grad noch aufgefallen ist, das das Erstellen der Logdatei so wie ich es jetzt habe nicht viel sin macht.
Wenn beim Kopieren ein neuer Ordner rein kommt, wird er wohlmöglich vor dem kopieren mit ins log geschrieben oder?
Man könnte, das Logfile ja auch von robocopy Erstellen lassen, aber da wird das auswerten sicher schwieriger.
Ich bin dankbar für jede Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 291928
Url: https://administrator.de/forum/batch-einmaliges-kopieren-mit-robocopy-und-log-abgleich-291928.html
Ausgedruckt am: 15.05.2025 um 14:05 Uhr
35 Kommentare
Neuester Kommentar
Hallo Rotbart.
Mag sein, dass ich irgend etwas nicht richtig verstanden habe, aber ROBOCOPY kopiert keine Dateien die gleich sind (es sei denn, Option /IS wird übergeben). Und ja, das Loggen solltest du ROBOCOPY überlassen. Schau dir die entsprechenden /N... Optionen an, wenn du bestimmte Ausgaben nicht im Log haben willst.
Grüße
rubberman
Mag sein, dass ich irgend etwas nicht richtig verstanden habe, aber ROBOCOPY kopiert keine Dateien die gleich sind (es sei denn, Option /IS wird übergeben). Und ja, das Loggen solltest du ROBOCOPY überlassen. Schau dir die entsprechenden /N... Optionen an, wenn du bestimmte Ausgaben nicht im Log haben willst.
Grüße
rubberman
OK, so ganz habe ich das noch nicht verstanden, aber ich kann dir ja trotzdem versuchen eine Richtung zu zeigen.
Die Idee ist, einen ROBOCOPY Job zu erstellen.
In meiner Beispielumgebung gibt es ein Verzeichnis "a" als Quelle und ein Verzeichnis "x" als Ziel. Die Logdatei wird bei jedem Kopiervorgang erweitert (um die Verzeichnisse die neu kopiert wurden). Die Job Datei wird dynamisch erstellt.
Grüße
rubberman
allerdings immer noch viele Leerzeichen am Anfang
Sind Tabs. Für mein Beispiel würden die aber ignoriert werden, ebenso Leerzeilen.Die Idee ist, einen ROBOCOPY Job zu erstellen.
In meiner Beispielumgebung gibt es ein Verzeichnis "a" als Quelle und ein Verzeichnis "x" als Ziel. Die Logdatei wird bei jedem Kopiervorgang erweitert (um die Verzeichnisse die neu kopiert wurden). Die Job Datei wird dynamisch erstellt.
@echo off &setlocal
set "src=a"
set "dest=x"
set "log=test.log"
set "job=TEST"
>"%job%.RCJ" (
for %%I in ("/SD:%src%\" "/DD:%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%" "/XD") do (
echo %%~I
)
)
copy /b "%job%.RCJ" /b + "%log%" /b
robocopy /job:"%job%"
Grüße
rubberman
Die beiden Schalter /SD /DD sagen ja, das keine Quelle und Ziel vorhanden sind.
Nee im Gegenteil. Sie geben Quelle und Ziel an.Dein Fehler kommt (ausnahmsweise) vom sonst nützlichen ECHO ON. Der Prompt wandert mit in die Job Datei, was natürlich zum Crash führt.
Ergo, stelle den Prompt mit ECHO OFF wieder aus.
//Edit
Genügt natürlich, wenn du das nur für die Umleitung tust, à la
>"%job%.RCJ" (
@echo off
for %%I in ("%src%\" "%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:%log%" "/XD") do (
echo %%~I
)
echo on
)
Grüße
rubberman
Naja, genau an der Stelle verstehe ich den Sinn nicht. Aber vielleicht so:
Grüße
rubberman
@echo off &setlocal
set "kopi=F:\ordner1\ordner2"
set "dest=E:\ordner3"
for /f "delims=" %%i in ('dir /ad /b "%kopi%\?????"^|findstr /x "[0-9][0-9][0-9][0-9][0-9]"') do for %%j in ("%kopi%\%%i") do (
>"JOB.RCJ" (
for %%I in ("/SD:%%~fj\" "/DD:%dest%\" "/XX" "/S" "/R:0" "/W:0" "/NS" "/NC" "/NFL" "/NJH" "/NJS" "/NP" "/LOG+:log_%%i.log" "/XD") do (
echo %%~I
)
)
copy /b "JOB.RCJ" /b + "log_%%i.log" /b
robocopy /job:"JOB"
)
Grüße
rubberman
Hallo Rotbart,
mit WinRAR kann ich nicht viel anfangen. Nie installiert/benutzt. Zeile 8 gehört aber an Zeile 7 angehängt, à la
Erst mal weiß ich nicht so genau was du mit den elfundneunzig Errorlevelabfragen vorhast. Nach der Schleife hast du den Errorlevel des allerletzten Aufrufs von unrar an dieser Stelle. Und wenn du nicht mit der Errorlevelvariable arbeitest, sondern statt dessen mit dem althergebrachten ...
... was so viel heißt wie "Wenn der Errorlevel größer oder gleich 1 ist, dann...", brauchst du das nicht für jeden Wert einzeln.
Grüße
rubberman
mit WinRAR kann ich nicht viel anfangen. Nie installiert/benutzt. Zeile 8 gehört aber an Zeile 7 angehängt, à la
FOR /F "delims=*" %%A IN ('dir /b /s /a-d *.rar') do (unrar x "%%A" "%%~dpA" && echo %%A>>E:\RAR-LOG.txt)
Erst mal weiß ich nicht so genau was du mit den elfundneunzig Errorlevelabfragen vorhast. Nach der Schleife hast du den Errorlevel des allerletzten Aufrufs von unrar an dieser Stelle. Und wenn du nicht mit der Errorlevelvariable arbeitest, sondern statt dessen mit dem althergebrachten ...
if errorlevel 1 goto P2
Mit dieser Zeile wollte ich den Ordnerinhalt mit der RAR-LOG.txt vergleichen und an Winrar übergeben.
Sinnvollerweise wirst du doch sicher die Ausgabe des DIR Commands direkt an FINDSTR übergeben.FOR /F "delims=*" %%A IN ('dir /b /s /a-d *.rar^|findstr /lvxg:"E:\RAR-LOG.txt"') do (unrar x "%%A" "%%~dpA" && echo %%A>>"E:\RAR-LOG.txt")
Grüße
rubberman
Kann es sein das der "findstr /lvxg:" Befehl fehlerhaft arbeitet?
Normalerweise nicht. Wichtig ist nur dass die Pfade ohne umschließende Anführungszeichen in der Datei abgelegt sind. Ansonsten:/L vergleiche als Stringliteral (nicht als RegEx)
/V gib nur das aus, was nicht gefunden wurde
/X vergleiche die gesamte Zeile
/G: Suchzeichenfolgen aus der angegebenen Datei entnehmen.
Ein Problem ist auch, das man für den g: Schalter, erst die "DepackLOG.txt" anlegen (einmalig) und eine Zeile manuell einfügen muss. Ansonsten kommt eine Fehlermeldung.
Dann schreib eine Zeile, die nicht in einem Pfad vorkommen kann/darf. Z.B. so:if not exist "DepackLOG.txt" >>"DepackLOG.txt" echo(^<
Das mit dem Errorlevel musste ich so lösen, da Winrar bei erneutem Durchlauf, immer die Meldung "Keine Dateien zum Entpacken gefunden" ausgibt.
Erstens verstehe ich nicht, warum diese Meldung kommen sollte und zweitens kann ich dir keine Lösung anbieten, solange ich nicht weiß, was du in diesem Fall tust.Grüße
rubberman
Leider sind tatsächlich Anführungszeichen in der Ausgabe vorhanden.
Woher kommen die noch? Ich habe die Anführungszeichen bei der ECHO Umleitung längst entfernt.Mit der If Errorabfrage wollte ich bis jetzt nur in eine Warteschleife gehen
Das betriftt doch dann nur die entsprechende Datei und nicht alle. Warum also noch einmal von vorn alle Dateien beackern?OK, also etwa so:
@echo off &setlocal
set folder="E:\Ordner1\Ordner2\Ordner3\Ordner4\"
pushd %folder%
if not exist "DepackLOG.txt" >>"DepackLOG.txt" echo(^<
FOR /F "delims=*" %%A IN ('dir /s /b *.rar^|findstr /lvxg:"DepackLOG.txt"') do (
"C:\Program Files\WinRAR\unrar" x "%%A" "%%~dpA"
if not errorlevel 10 if errorlevel 1 (
>nul timeout /t 10 /nobreak
"C:\Program Files\WinRAR\unrar" x "%%A" "%%~dpA"
if not errorlevel 1 >>"DepackLOG.txt" echo %%A
) else (
>>"DepackLOG.txt" echo %%A
)
)
rubbermann
Nee, nee, irgendwas muss mit den Daten in der Logdatei faul sein. Prüf noch mal, ob du irgendwelche voran- oder nachgestellte Leerzeichen in der Zeile hast. (In dem Zusammenhang auch prüfen, ob sich nach
Grüße
rubberman
echo %%A
in deinem Script noch ein Leerzeichen eingemogelt hat.) Nochmal: Option /x vergleicht die gesamte Zeile mit allem was dort steht und das macht auch absolut Sinn. Schließlich willst du ja nicht einen ähnlichen, sondern genau den aktuellen Dateiname matchen.Grüße
rubberman
Nein. Ich dachte du wolltest nur einmalig die vorhandene Datei editieren ...
Das Leerzeichen kommt ja irgendwo her. Anders gesagt, beim Schreiben der Logdatei läuft was schief. Das ist der Grund, warum ich dir oben schon mal geschrieben hatte, dass du dir auch den Code noch mal anschaun sollst. Die Vermutung liegt nahe, dass du in den beiden Zeilen mit
noch ein zusätzliches Leerzeichen hinter dem %%A stehen hast. Das würde mit dem ECHO auch ausgegeben werden und wandert bei der Umleitung in die Datei.
Grüße
rubberman
Das Leerzeichen kommt ja irgendwo her. Anders gesagt, beim Schreiben der Logdatei läuft was schief. Das ist der Grund, warum ich dir oben schon mal geschrieben hatte, dass du dir auch den Code noch mal anschaun sollst. Die Vermutung liegt nahe, dass du in den beiden Zeilen mit
>>"DepackLOG.txt" echo %%A
noch ein zusätzliches Leerzeichen hinter dem %%A stehen hast. Das würde mit dem ECHO auch ausgegeben werden und wandert bei der Umleitung in die Datei.
Grüße
rubberman
Ich wollte, ich würde bei dem Durcheinander wieder mal durchblicken 
Nochmal ganz langsam. In deiner DepackLOG.txt Datei finden sich die Namen der verarbeiteten *.rar Dateien. Die /XD Option von Robocopy spezifiziert Verzeichnisse die augeschlossen werden sollen. Es sollte ziemlich offensichtlich sein, dass das nicht funktionieren kann.
Grüße
rubberman
Das Problem ist nun, das der Robocopy Job den fehlerhaften Ordner/rar mit aufzeichnet.
Keine Ahnung was du meinst. Manchmal glaube ich, du vergisst völlig, dass niemand außer dir vor deinem Rechner sitzt und sieht was du siehst.Nochmal ganz langsam. In deiner DepackLOG.txt Datei finden sich die Namen der verarbeiteten *.rar Dateien. Die /XD Option von Robocopy spezifiziert Verzeichnisse die augeschlossen werden sollen. Es sollte ziemlich offensichtlich sein, dass das nicht funktionieren kann.
Grüße
rubberman
Keine Ahnung wie man das jetzt Lösen soll.
Statt wild drauf los zu probieren, die Hilfe zu Robocopy lesen, wäre mein Ansatz gewesen.Nun soll aber nicht nur das "file.rar" kopiert werden, sondern alles was nach Ordner4\ kommt.
Ähm, du meinst "Testordner1" bis "Testordner3"?Ungetestet:
for /f "usebackq skip=1 delims=" %%i in ("E:\Ordner1\Ordner2\Ordner3\Ordner4\DepackLOG.txt") do (
robocopy "%%~dpi." "F:\Ordner1\Ordner2" /S /XF "%%i"
)
Grüße
rubberman
Ja, Ordner1 bis Ordner3. Also alles, was sich in Ordner4 befindet.
Ich kann an meinem Rechner nicht sehen, ob das bei dir alles ist, oder ob sich auch noch ein Ordner4711 und ein Ordner0815 darin befindet. Ebenso wenig, was damit passieren soll, wenn es so wäre.Ich weiß nicht was du da tust. Das einzige was ich machen kann ist mitraten.
set "folder=E:\Ordner1\Ordner2\Ordner3\Ordner4\"
pushd "%folder%"
if not exist "COPYLOG.txt" >>"COPYLOG.txt" echo(^<
for /f "skip=1 delims=" %%A in ('findstr /lvxg:"DepackLOG.txt" "COPYLOG.txt"') do (
robocopy "%%~dpA." "F:\Ordner1\Ordner2" /S & echo %%A>>COPYLOG.txt)
popd

Moin,
Gruß jodel32
in der folgenden "test.txt" Datei, sind an jedem Zeilenende, noch Backslash \ vorhanden. Diese möchte ich gern alle gelöscht haben.
@echo off & setlocal ENABLEDELAYEDEXPANSION
>"C:\pfade_ohne_backslash.txt" (for /f "usebackq delims=" %%a in ("C:\text.txt") do set "fullpath=%%a" & echo !fullpath:~0,-1!)
Diese möchte ich gern alle gelöscht haben.
Ist machbar. Leider schreibst du nicht warum das so sein soll. Vielleicht ist dir der Punkt inrobocopy "%%~dpA." ...
aufgefallen. Der steht für "dieses Verzeichnis". Ein "C:\foo\." ist gleichbedeutend mit "C:\foo". Wenn du also die Pfade in deiner Datei weiterverarbeiten willst und dich der Backslash stört, kannst du ebenso gut nach dem Einlesen einer Zeile den Punkt anhängen. Aber das nur nebenbei (da ich glaube, du machst dir das Leben manchmal selbst schwer, erklärst aber nie was dein Endziel für die Aktionen ist)...
Wie auch immer. Derselbe Punkt dient auch der Entfernung der Backslashes, wie von dir gewünscht.
@echo off &setlocal
>"%temp%\temp.txt~" (
for /f "usebackq delims=" %%i in ("text.txt") do for %%j in ("%%~i.") do echo %%~fj
)
move /y "%temp%\temp.txt~" "text.txt"
Grüße
rubberman
//EDIT Huch, hier liest ja doch noch jemand mit

Zufällig über den Mega-Thread gestolpert, da wollte ich dir etwas unter die Arme greifen
Ich kenn das wenn ein TO nicht locker lässt
, obwohl man hier ja kaum noch durchblickt was der TO damit eigentlich bezwecken will. Eine saubere Liste von Robocopy bekommt man auch mit einem 1-Zeiler Powershell, aber damit ist der TO sicherlich noch mehr überfordert.
Als denn, dann noch viel Spaß hier...
Gruß jodel32
Als denn, dann noch viel Spaß hier...
Gruß jodel32