Robocopy - mehrere Versionen geänderter Dateien archivieren
Hallo,
ich versuche Robocopy ein paar neue Tricks beizubringen...
für den Fall, dass Robocopy eine geänderte/neuere Datei im Quellverzeichnis findet soll Robocopy nicht die vorhandene Datei im Zielverzeichnis ersetzen, sondern diese umbenennen (dateiname%datum%%Uhrzeit%) und dann die aktuelle Datei kopieren, so dass eine Art Versionshistorie im Archiv entsteht. Leider bin ich noch nicht auf den richtigen Schalter gestoßen und bitte euch daher um Hilfe
Bisheriger Script (Beispiel):
robocopy "\\Dc01\Volume-Z\Software\Treiber" "D:\archive\test" /E /SEC /COPYALL /LOG+:d:\robocopy.log /TEE /V /R:10 /W:30
Gruß
Tim
ich versuche Robocopy ein paar neue Tricks beizubringen...
für den Fall, dass Robocopy eine geänderte/neuere Datei im Quellverzeichnis findet soll Robocopy nicht die vorhandene Datei im Zielverzeichnis ersetzen, sondern diese umbenennen (dateiname%datum%%Uhrzeit%) und dann die aktuelle Datei kopieren, so dass eine Art Versionshistorie im Archiv entsteht. Leider bin ich noch nicht auf den richtigen Schalter gestoßen und bitte euch daher um Hilfe
Bisheriger Script (Beispiel):
robocopy "\\Dc01\Volume-Z\Software\Treiber" "D:\archive\test" /E /SEC /COPYALL /LOG+:d:\robocopy.log /TEE /V /R:10 /W:30
Gruß
Tim
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 121915
Url: https://administrator.de/contentid/121915
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo,
nachdem ich auch an diesem Feature interessiert bin und nichts passendes dazu gefunden habe, habe ich mir mal ein kleines Batch-File geschrieben um dies zu realisieren. Für euch beide warscheinlich schon zu spät, aber vielleicht hilft es anderen, die sowas mit einfachen Mitteln realisieren wollen.
Für mich war es das erste Mal, dass ich ein Script schreibe, das mehr als nur Programmaufrufe macht. Also ist es nicht umbedingt die eleganteste Lösung in allen Punkten. Könnte aber wie gesagt als Ansatzpunkt dienen.
Die Lösung nutzt das Feature von Robocopy einen Kopiervorgang zu machen ohne wirklich was zu überschreiben. Anhand des Rückgabewertes und Variation der Aufrufparameter kann man erkennen ob das zu kopierende File schon in gleicher oder geänderter Form auf dem Zielverzeichnis liegt und dieses dann ggf. umbenennen.
Leider ist es nicht das schnellste Pferd im Stall - die Geschwindigkeit ist im Vergleich zum "nackten" Robocopy etwas bescheiden, wenn es darum geht unveränderte Dateien zu überspringen (bei mir ca. 40 pro Sekunde). Wenn sich jemand mal die Mühe macht, das gleiche in C oder Ähnlichem zu schreiben, könnte es deutlich flotter gehen.
Nach dem ganzen Blabla hier das Script (bei mir funktioniert es - Nutzung auf eigene Gefahr):
echo off
set LogFile=D:\backup.log
set src=D:\temp\src\
set dst=D:\temp\dst\
echo. >>%LogFile%
echo Backup %src% nach %dst% gestartet: %date% %time% >>%LogFile%
echo Backup %src% nach %dst% gestartet...
set allcount=0
set copycount=0
set renamecount=0
set skipcount=0
set errorcount=0
set dispcount=0
for /f "tokens=* delims= " %%a in ('attrib /s "%src%*.*"') do call :loopenter "%%a"
goto :Ende
:loopenter
set temppath="%~1"
set temppath="%temppath:~12%
call :loop %temppath%
goto Exitsub
:loop
call :IncAll
set srcpath="%~dp1"
setlocal enabledelayedexpansion
set tdest=!srcpath:%src%=%dst%!
endlocal & set dstpath=%tdest%
set srcpath=%srcpath:\"="%
set dstpath=%dstpath:\"="%
set file="%~nx1"
REM dummy copy mit überschreiben
robocopy %srcpath% %dstpath% %file% /L /W:1 /R:1 >nul
REM wenn dummy nicht kopiert haette, counter erhoehen und exit
if not errorlevel 1 goto IncSkip
REM ansonsten copy ohne ueberschreiben
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >nul
REM bei Fehler Ergebnis noch mal provozieren und exit
if errorlevel 2 (
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 /L>>%LogFile%
goto IncError
)
REM wenn kopiert wurde, counter erhoehen und exit
if errorlevel 1 goto IncCopy
REM wenn nicht kopiert werden konnte, dann rename
set zeit=%time:~0,-3%
rename "%dstpath:~1,-1%\%file:~1,-1%" "%~n1(%date%_%zeit::=#%#R)%~x1"
REM noch mal kopieren
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >nul
REM bei Fehler Ergebnis noch mal provozieren und exit
if errorlevel 2 (
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 /L >>%LogFile%
goto IncError
)
REM counter erhoehen und exit
goto IncRename
:Exitsub
exit /b 0
:IncAll
set /a allcount+=1
REM das hier ist nur um zu sehen, dass er noch was macht
set /a dispcount+=1
if %dispcount%==500 (
echo %allcount%
set dispcount=0
)
goto Exitsub
:IncCopy
set /a copycount+=1
goto Exitsub
:IncRename
set /a renamecount+=1
goto Exitsub
:IncSkip
set /a skipcount+=1
goto Exitsub
:IncError
set /a errorcount+=1
goto Exitsub
:Ende
echo %allcount% Files in Quellverzeichnis gefunden
echo %copycount% neue Files kopiert
echo %renamecount% neue Files (mit Umbenennung) kopiert
echo %skipcount% identische Files uebersprungen
echo %errorcount% Files konnten nicht kopiert werden
echo %allcount% Files in Quellverzeichnis gefunden >>%LogFile%
echo %copycount% neue Files kopiert >>%LogFile%
echo %renamecount% neue Files (mit Umbenennung) kopiert >>%LogFile%
echo %skipcount% identische Files uebersprungen >>%LogFile%
echo %errorcount% Files konnten nicht kopiert werden >>%LogFile%
echo Backup beendet: %date% %time% >>%LogFile%
echo. >>%LogFile%
echo on
nachdem ich auch an diesem Feature interessiert bin und nichts passendes dazu gefunden habe, habe ich mir mal ein kleines Batch-File geschrieben um dies zu realisieren. Für euch beide warscheinlich schon zu spät, aber vielleicht hilft es anderen, die sowas mit einfachen Mitteln realisieren wollen.
Für mich war es das erste Mal, dass ich ein Script schreibe, das mehr als nur Programmaufrufe macht. Also ist es nicht umbedingt die eleganteste Lösung in allen Punkten. Könnte aber wie gesagt als Ansatzpunkt dienen.
Die Lösung nutzt das Feature von Robocopy einen Kopiervorgang zu machen ohne wirklich was zu überschreiben. Anhand des Rückgabewertes und Variation der Aufrufparameter kann man erkennen ob das zu kopierende File schon in gleicher oder geänderter Form auf dem Zielverzeichnis liegt und dieses dann ggf. umbenennen.
Leider ist es nicht das schnellste Pferd im Stall - die Geschwindigkeit ist im Vergleich zum "nackten" Robocopy etwas bescheiden, wenn es darum geht unveränderte Dateien zu überspringen (bei mir ca. 40 pro Sekunde). Wenn sich jemand mal die Mühe macht, das gleiche in C oder Ähnlichem zu schreiben, könnte es deutlich flotter gehen.
Nach dem ganzen Blabla hier das Script (bei mir funktioniert es - Nutzung auf eigene Gefahr):
echo off
set LogFile=D:\backup.log
set src=D:\temp\src\
set dst=D:\temp\dst\
echo. >>%LogFile%
echo Backup %src% nach %dst% gestartet: %date% %time% >>%LogFile%
echo Backup %src% nach %dst% gestartet...
set allcount=0
set copycount=0
set renamecount=0
set skipcount=0
set errorcount=0
set dispcount=0
for /f "tokens=* delims= " %%a in ('attrib /s "%src%*.*"') do call :loopenter "%%a"
goto :Ende
:loopenter
set temppath="%~1"
set temppath="%temppath:~12%
call :loop %temppath%
goto Exitsub
:loop
call :IncAll
set srcpath="%~dp1"
setlocal enabledelayedexpansion
set tdest=!srcpath:%src%=%dst%!
endlocal & set dstpath=%tdest%
set srcpath=%srcpath:\"="%
set dstpath=%dstpath:\"="%
set file="%~nx1"
REM dummy copy mit überschreiben
robocopy %srcpath% %dstpath% %file% /L /W:1 /R:1 >nul
REM wenn dummy nicht kopiert haette, counter erhoehen und exit
if not errorlevel 1 goto IncSkip
REM ansonsten copy ohne ueberschreiben
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >nul
REM bei Fehler Ergebnis noch mal provozieren und exit
if errorlevel 2 (
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 /L>>%LogFile%
goto IncError
)
REM wenn kopiert wurde, counter erhoehen und exit
if errorlevel 1 goto IncCopy
REM wenn nicht kopiert werden konnte, dann rename
set zeit=%time:~0,-3%
rename "%dstpath:~1,-1%\%file:~1,-1%" "%~n1(%date%_%zeit::=#%#R)%~x1"
REM noch mal kopieren
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >nul
REM bei Fehler Ergebnis noch mal provozieren und exit
if errorlevel 2 (
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 /L >>%LogFile%
goto IncError
)
REM counter erhoehen und exit
goto IncRename
:Exitsub
exit /b 0
:IncAll
set /a allcount+=1
REM das hier ist nur um zu sehen, dass er noch was macht
set /a dispcount+=1
if %dispcount%==500 (
echo %allcount%
set dispcount=0
)
goto Exitsub
:IncCopy
set /a copycount+=1
goto Exitsub
:IncRename
set /a renamecount+=1
goto Exitsub
:IncSkip
set /a skipcount+=1
goto Exitsub
:IncError
set /a errorcount+=1
goto Exitsub
:Ende
echo %allcount% Files in Quellverzeichnis gefunden
echo %copycount% neue Files kopiert
echo %renamecount% neue Files (mit Umbenennung) kopiert
echo %skipcount% identische Files uebersprungen
echo %errorcount% Files konnten nicht kopiert werden
echo %allcount% Files in Quellverzeichnis gefunden >>%LogFile%
echo %copycount% neue Files kopiert >>%LogFile%
echo %renamecount% neue Files (mit Umbenennung) kopiert >>%LogFile%
echo %skipcount% identische Files uebersprungen >>%LogFile%
echo %errorcount% Files konnten nicht kopiert werden >>%LogFile%
echo Backup beendet: %date% %time% >>%LogFile%
echo. >>%LogFile%
echo on
Hallo zusammen,
Nach langer suche bin ich auf diese Seite gestoßen und genau das wollte ich haben.
Doch leider funktioniert dieses Skript nicht mehr.
Ich kenne mich mit Programmieren absolut nicht aus und bräuchte eure Hilfe.
Versucht auf Win 10 und Windows Server 2019 mit dem gleichen Ergebnis.
Hier die ausgabe der Log Datei.
Für jede Hilfe bin ich sehr Dankbar.
Gruß Zwergie
Nach langer suche bin ich auf diese Seite gestoßen und genau das wollte ich haben.
Doch leider funktioniert dieses Skript nicht mehr.
Ich kenne mich mit Programmieren absolut nicht aus und bräuchte eure Hilfe.
Versucht auf Win 10 und Windows Server 2019 mit dem gleichen Ergebnis.
Hier die ausgabe der Log Datei.
Backup D:\Ordner\ nach D:\Ordner1\ gestartet: 19.03.2023 13:54:24,18
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren fr Windows
-------------------------------------------------------------------------------
Gestartet: Sonntag, 19. M„rz 2023 13:54:24
Quelle : D:\ D:\Ordner\
Ziel : D:\ D:\Ordner1\
Dateien : Neues Textdokument - Kopie.txt
Optionen: /L /DCOPY:DA /COPY:DAT /XO /XN /XC /A+:R /R:1 /W:1
------------------------------------------------------------------------------
2023/03/19 13:54:24 FEHLER 123 (0x0000007B) Zugriff auf Quellverzeichnis D:\ D:\Ordner\
Die Syntax fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren fr Windows
-------------------------------------------------------------------------------
Gestartet: Sonntag, 19. M„rz 2023 13:54:24
Quelle : D:\ D:\Ordner\
Ziel : D:\ D:\Ordner1\
Dateien : Neues Textdokument.txt
Optionen: /L /DCOPY:DA /COPY:DAT /XO /XN /XC /A+:R /R:1 /W:1
------------------------------------------------------------------------------
2023/03/19 13:54:24 FEHLER 123 (0x0000007B) Zugriff auf Quellverzeichnis D:\ D:\Ordner\
Die Syntax fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren fr Windows
-------------------------------------------------------------------------------
Gestartet: Sonntag, 19. M„rz 2023 13:54:24
Quelle : D:\ D:\Ordner\
Ziel : D:\ D:\Ordner1\
Dateien : Textdokument.txt
Optionen: /L /DCOPY:DA /COPY:DAT /XO /XN /XC /A+:R /R:1 /W:1
------------------------------------------------------------------------------
2023/03/19 13:54:24 FEHLER 123 (0x0000007B) Zugriff auf Quellverzeichnis D:\ D:\Ordner\
Die Syntax fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.
3 Files in Quellverzeichnis gefunden
0 neue Files kopiert
0 neue Files (mit Umbenennung) kopiert
0 identische Files uebersprungen
3 Files konnten nicht kopiert werden
Backup beendet: 19.03.2023 13:54:24,70
Backup D:\Ordner\ nach D:\Ordner1\ gestartet: 19.03.2023 14:16:45,45
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren fr Windows
-------------------------------------------------------------------------------
Gestartet: Sonntag, 19. M„rz 2023 14:16:45
Quelle : D:\ D:\Ordner\
Ziel : D:\ D:\Ordner1\
Dateien : Neues Textdokument - Kopie.txt
Optionen: /L /DCOPY:DA /COPY:DAT /XO /XN /XC /A+:R /R:1 /W:1
------------------------------------------------------------------------------
2023/03/19 14:16:45 FEHLER 123 (0x0000007B) Zugriff auf Quellverzeichnis D:\ D:\Ordner\
Die Syntax fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren fr Windows
-------------------------------------------------------------------------------
Gestartet: Sonntag, 19. M„rz 2023 14:16:45
Quelle : D:\ D:\Ordner\
Ziel : D:\ D:\Ordner1\
Dateien : Neues Textdokument.txt
Optionen: /L /DCOPY:DA /COPY:DAT /XO /XN /XC /A+:R /R:1 /W:1
------------------------------------------------------------------------------
2023/03/19 14:16:45 FEHLER 123 (0x0000007B) Zugriff auf Quellverzeichnis D:\ D:\Ordner\
Die Syntax fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren fr Windows
-------------------------------------------------------------------------------
Gestartet: Sonntag, 19. M„rz 2023 14:16:45
Quelle : D:\ D:\Ordner\
Ziel : D:\ D:\Ordner1\
Dateien : Textdokument.txt
Optionen: /L /DCOPY:DA /COPY:DAT /XO /XN /XC /A+:R /R:1 /W:1
------------------------------------------------------------------------------
2023/03/19 14:16:45 FEHLER 123 (0x0000007B) Zugriff auf Quellverzeichnis D:\ D:\Ordner\
Die Syntax fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.
3 Files in Quellverzeichnis gefunden
0 neue Files kopiert
0 neue Files (mit Umbenennung) kopiert
0 identische Files uebersprungen
3 Files konnten nicht kopiert werden
Backup beendet: 19.03.2023 14:16:45,97
Für jede Hilfe bin ich sehr Dankbar.
Gruß Zwergie
Hier das funktionierende Script und wie man es nutzen sollte, kann.
Mann sollte den ersten Kopiervorgang mit dem Script Ausführen, dabei werden pro kopierte Datei, 2 Dateien erstellt,
eine 1zu1 und eine mit Datum-Zeit Stempel.
z b "Neu.txt" und " Neu(10.10.2023_10'10'10).txt". das ist sehr wichtig, denn wenn z b eine Datei Namens "Neu.txt" ohne das dazugehörende"Neu(10.10.2023_10'10'10).txt" Datei im Ordner ist, dann wird die Originaldatei "Neu.txt" in diesem Fall beim ersten mal überschrieben, wenn sich diese Datei im Original Ordner in der Zwischenzeit geändert hätte.
Wenn sich die Daten im Original Ordner nicht ändern, erfolgt keine Kopie.
Wenn die Datei Neu.txt und Neu(10.10.2023_10'10'10).txt existiert, und die Datei Datei Neu.txt
sich zwichenzeitlich geändert hat, wird in diesem Fall eine neue Datei erstellt.
z. B.
Datei Neu.txt
Neu(10.10.2023_10'10'10).txt
Neu(11.10.2023_15'15'15).txt
Neu(12.12.2023_09'08'20).txt
usw.
Wenn einer eine Idee hätte, wie man das ganze so umschreiben könnte, das es durchnummerriert wird, wäre es super.
In etwa:
Neu.txt
Neu.txt(1)
Neu.txt(2)
Neu.txt(3)
Gruß Zwergie
Mann sollte den ersten Kopiervorgang mit dem Script Ausführen, dabei werden pro kopierte Datei, 2 Dateien erstellt,
eine 1zu1 und eine mit Datum-Zeit Stempel.
z b "Neu.txt" und " Neu(10.10.2023_10'10'10).txt". das ist sehr wichtig, denn wenn z b eine Datei Namens "Neu.txt" ohne das dazugehörende"Neu(10.10.2023_10'10'10).txt" Datei im Ordner ist, dann wird die Originaldatei "Neu.txt" in diesem Fall beim ersten mal überschrieben, wenn sich diese Datei im Original Ordner in der Zwischenzeit geändert hätte.
Wenn sich die Daten im Original Ordner nicht ändern, erfolgt keine Kopie.
Wenn die Datei Neu.txt und Neu(10.10.2023_10'10'10).txt existiert, und die Datei Datei Neu.txt
sich zwichenzeitlich geändert hat, wird in diesem Fall eine neue Datei erstellt.
z. B.
Datei Neu.txt
Neu(10.10.2023_10'10'10).txt
Neu(11.10.2023_15'15'15).txt
Neu(12.12.2023_09'08'20).txt
usw.
echo off
set LogFile=D:\temp\backup.log
set src=D:\temp\src\
set dst=D:\temp\dst\
echo. >>%LogFile%
echo Backup %src% nach %dst% gestartet: %date% %time% >>%LogFile%
echo Backup %src% nach %dst% gestartet...
set allcount=0
set copycount=0
set renamecount=0
set skipcount=0
set errorcount=0
set dispcount=0
for /f "tokens=* delims= " %%a in ('attrib /s "%src%*.*"') do call :loopenter "%%a"
goto :Ende
:loopenter
set temppath="%~1"
set temppath="%temppath:~22%
call :loop %temppath%
goto Exitsub
:loop
call :IncAll
set srcpath="%~dp1"
setlocal enabledelayedexpansion
set tdest=!srcpath:%src%=%dst%!
endlocal & set dstpath=%tdest%
set srcpath=%srcpath:\"="%
set dstpath=%dstpath:\"="%
set file="%~nx1"
REM dummy copy mit überschreiben
robocopy %srcpath% %dstpath% %file% /W:1 /R:1 >nul
REM wenn dummy nicht kopiert haette, counter erhoehen und exit
if not errorlevel 1 goto IncSkip
REM ansonsten copy ohne ueberschreiben
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >nul
REM bei Fehler Ergebnis noch mal provozieren und exit
if errorlevel 2 (
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >>%LogFile%
goto IncError
)
REM wenn kopiert wurde, counter erhoehen und exit
if errorlevel 1 goto IncCopy
REM wenn nicht kopiert werden konnte, dann rename
set zeit=%time:~0,-3%
rename "%dstpath:~1,-1%\%file:~1,-1%" "%~n1(%date%_%zeit::='%)%~x1"
REM noch mal kopieren
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >nul
REM bei Fehler Ergebnis noch mal provozieren und exit
if errorlevel 2 (
robocopy %srcpath% %dstpath% %file% /XC /XN /XO /A+:R /W:1 /R:1 >>%LogFile%
goto IncError
)
REM counter erhoehen und exit
goto IncRename
:Exitsub
exit /b 0
:IncAll
set /a allcount+=1
:IncCopy
set /a copycount+=1
goto Exitsub
:IncRename
set /a renamecount+=1
goto Exitsub
:IncSkip
set /a skipcount+=1
goto Exitsub
:IncError
set /a errorcount+=1
goto Exitsub
:Ende
echo %allcount% Files in Quellverzeichnis gefunden
echo %renamecount% neue Files (mit Umbenennung) kopiert
echo %skipcount% identische Files uebersprungen
echo %errorcount% Files konnten nicht kopiert werden
echo %allcount% Files in Quellverzeichnis gefunden >>%LogFile%
echo %allcount% Files in Quellverzeichnis gefunden >>%LogFile%
echo %copycount% neue Files kopiert >>%LogFile%
echo %renamecount% neue Files (mit Umbenennung) kopiert >>%LogFile%
echo %skipcount% identische Files uebersprungen >>%LogFile%
echo %errorcount% Files konnten nicht kopiert werden >>%LogFile%
echo Backup beendet: %date% %time% >>%LogFile%
echo. >>%LogFile%
echo on
Wenn einer eine Idee hätte, wie man das ganze so umschreiben könnte, das es durchnummerriert wird, wäre es super.
In etwa:
Neu.txt
Neu.txt(1)
Neu.txt(2)
Neu.txt(3)
Gruß Zwergie