timjupe
Goto Top

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 face-smile

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

Content-Key: 121915

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

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

Member: Exzel
Exzel Nov 11, 2009 at 08:44:09 (UTC)
Goto Top
Hallo!

Mich interessiert dieses Thema auch.

Schon irgendeine Lösung gefunden?


Gruß
Member: SpottyDog
SpottyDog Mar 17, 2010 at 13:15:56 (UTC)
Goto Top
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
Member: Exzel
Exzel Mar 17, 2010 at 14:37:46 (UTC)
Goto Top
Hallo SpottyDog,

verwende zwar jetzt SyncToy von Microsoft als Synchronisationstool, bedanke mich aber trotzdem für die Rückmeldung. Vielleicht kann ich es ja trotzdem mal brauchen!

Gruß
Member: Zwergie
Zwergie Mar 19, 2023, updated at Mar 20, 2023 at 14:23:04 (UTC)
Goto Top
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.


Backup D:\Ordner\ nach D:\Ordner1\ gestartet: 19.03.2023 13:54:24,18 

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren fr 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 fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.


-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren fr 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 fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.


-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren fr 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 fr 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 fr 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 fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.


-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren fr 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 fr den Dateinamen, Verzeichnisnamen oder die Datentr„gerbezeichnung ist falsch.


-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren fr 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 fr 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
Member: Zwergie
Zwergie Apr 14, 2023, updated at Apr 27, 2023 at 17:45:03 (UTC)
Goto Top
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.

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
Member: Zwergie
Zwergie May 16, 2023 at 18:37:05 (UTC)
Goto Top