RoboCopy mit sichern von gelöschten Dateien
ich sichere mit RoboCopy in regelmäßigen Abständen meine Daten. Da jedoch durch die Option /MIR oder /PURGE versehentlich gelöschte Daten oder Verzeichnisse auch in der Sicherung gelöscht werden habe ich dieses Script geschrieben um gelöschte Daten in ein eigenes Verzeichnis zu verschieben.
Die Sicherung erfolgt zuerst mit RoboCopy ohne /MIR bzw. /PURGE Option. Dabei muss allerdings eine Logdatei mit speziellem Aufbau generiert werden. Die dazu benötigten Optionen sind:
/BYTES (Dateigröße immer in Bytes, da ansonsten zusätzliche Leerzeichen die Auswertung erschweren)
/FP (komplette Dateipfade loggen)
/LOG:file (Dateiname muss im Script eingetragen werden)
Im Script selbst braucht dann nur noch der Name des Logfiles sowie das gewünschte Sicherungsverzeichnis festgelegt werden.
Ich habe das Script mit englischem und mit deutschem Betriebssystem getestet und es funktioniert bei beiden.
Die Sicherung erfolgt zuerst mit RoboCopy ohne /MIR bzw. /PURGE Option. Dabei muss allerdings eine Logdatei mit speziellem Aufbau generiert werden. Die dazu benötigten Optionen sind:
/BYTES (Dateigröße immer in Bytes, da ansonsten zusätzliche Leerzeichen die Auswertung erschweren)
/FP (komplette Dateipfade loggen)
/LOG:file (Dateiname muss im Script eingetragen werden)
Im Script selbst braucht dann nur noch der Name des Logfiles sowie das gewünschte Sicherungsverzeichnis festgelegt werden.
@echo off
REM
REM Job zum Auswerten des Logfiles von Robocopy und verschieben der gelöschten Dateien in ein Sicherungsverzeichnis
REM
REM "Hilfsprogramme" ausführen
if "%1" == "-CHECK-" GOTO DoCheck
if "%1" == "-COPYF-" GOTO DoCopyFile
if "%1" == "-COPYD-" GOTO DoCopyDir
REM Hier die gewünschten Parameter eintragen:
REM COPY_DIR: Verzeichnis in welches die gelöschten Daten verschoben werden
REM LogFile: RoboCopy Logdatei
SET COPY_DIR=Deleted\%date%_%time:~0,2%_%time:~3,2%_%time:~6,2%
SET LogFile=Sicherung.log
REM Logdatei durcharbeiten
FOR /F "tokens=1,2,3,*" %%i in (%LogFile%) DO CALL %0 -CHECK- %%i %%j %%k "%%l"
goto Fertig
REM Prüfen einer Log-Zeile
:DoCheck
REM %2 %3 %4 %5
REM *ZUS. Verz. -1 D:\test\robo\d\u1\
REM *EXTRA Datei 1875110 D:\test\robo\d\cygwin1.dll
SET iii=%2
IF "%iii:~0,1%"=="*" (
echo %2 %3 %4 %5
IF "%4"=="-1" (
CALL %0 -COPYD- %5
) ELSE (
CALL %0 -COPYF- %5
)
ECHO.
)
goto end
REM Datei verschieben
:DoCopyFile
IF NOT EXIST "%COPY_DIR%\%~p2" (
ECHO MD "%COPY_DIR%\%~p2"
MD "%COPY_DIR%\%~p2"
)
ECHO CopyFile: %2 to "%COPY_DIR%\%~pnx2"
move %2 "%COPY_DIR%\%~pnx2"
goto end
REM Verzeichnis verschieben
:DoCopyDir
IF NOT EXIST "%COPY_DIR%\%~pnx2" (
ECHO MD "%COPY_DIR%\%~pnx2"
MD "%COPY_DIR%\%~pnx2"
)
ECHO CopyDir: "%~2*.*" TO "%COPY_DIR%\%~pnx2"
FOR /R %2 %%f IN (*.*) DO MOVE %f "%COPY_DIR%\%~pnx2"
rem XCOPY "%~2*.*" "%COPY_DIR%\%~pnx2"
goto end
:Fertig
:end
Ich habe das Script mit englischem und mit deutschem Betriebssystem getestet und es funktioniert bei beiden.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 156859
Url: https://administrator.de/contentid/156859
Ausgedruckt am: 13.11.2024 um 22:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo,
vielen Dank für diese Anleitung. Genau das was ich gesucht habe!
Aber ich habe ja ein kleines Problem beim Alltagstest festgestellt:
Nachdem ich eine Datei vom Quellverzeichnis gelöscht habe, verschiebt das Skript diese Datei in den "Deleted"-Ordner (...\Deleted\%Datum_Zeit%\Pseudopfad\Datei).
Wenn ich dann aber dann das Skript noch einmal ausführe, egal ob Dateien verändert/gelöscht/erstellt wurden oder nicht, dann wird (unter anderem) der oben genannte Ordner noch einmal erstellt (mit neuem Zeitstempel).
PS: Mit ist aufgefallen, dass diese Zeile im Sicherung.log erhalten bleibt:
*EXTRA Dir -1 C:\J\Deleted\
vielen Dank für diese Anleitung. Genau das was ich gesucht habe!
Aber ich habe ja ein kleines Problem beim Alltagstest festgestellt:
Nachdem ich eine Datei vom Quellverzeichnis gelöscht habe, verschiebt das Skript diese Datei in den "Deleted"-Ordner (...\Deleted\%Datum_Zeit%\Pseudopfad\Datei).
Wenn ich dann aber dann das Skript noch einmal ausführe, egal ob Dateien verändert/gelöscht/erstellt wurden oder nicht, dann wird (unter anderem) der oben genannte Ordner noch einmal erstellt (mit neuem Zeitstempel).
PS: Mit ist aufgefallen, dass diese Zeile im Sicherung.log erhalten bleibt:
*EXTRA Dir -1 C:\J\Deleted\
Hallo Bernhard,
danke für die Antwort. Ich hab das Skript korrigiert, aber der Fehler ist nach wie vor vorhanden.
Ich hab mich mal mit dem Code und der Systematik beschäftigt und mir ist folgendes aufgefallen:
%4 ist dann -1, wenn der Ordner/die Datei im Zielverzeichnis vorhanden ist, nicht aber im Quellverzeichnis.
Demnach erkennt das Skript Ordner/Dateien, die gelöscht wurden und verschiebt es im Zielverzeichnis entsprechend in den Delete-Ordner.
Da der Delete-Ordner und dessen Inhalt aber auch nicht im Quellverzeichnis vorhanden ist, bekommt er im Sicherung.log ebenfalls die Markierung -1 (bei %4).
Wenn es möglich wäre, eine if-else-Bedingung reinzuprogrammieren, die prüft ob %5 das Verzeichnis ist, in das die gelöschten Daten verschoben wurden (also: Deleted\%date%_%time:~0,2%_%time:~3,2%_%time:~6,2%). Und wenn ja, dann diese Zeile/diesen Ordner ignoriert, dann könnte es ja funktionieren.
Ich kann leider Batch nicht so gut programmieren.
Danke!
danke für die Antwort. Ich hab das Skript korrigiert, aber der Fehler ist nach wie vor vorhanden.
Ich hab mich mal mit dem Code und der Systematik beschäftigt und mir ist folgendes aufgefallen:
%4 ist dann -1, wenn der Ordner/die Datei im Zielverzeichnis vorhanden ist, nicht aber im Quellverzeichnis.
Demnach erkennt das Skript Ordner/Dateien, die gelöscht wurden und verschiebt es im Zielverzeichnis entsprechend in den Delete-Ordner.
Da der Delete-Ordner und dessen Inhalt aber auch nicht im Quellverzeichnis vorhanden ist, bekommt er im Sicherung.log ebenfalls die Markierung -1 (bei %4).
Wenn es möglich wäre, eine if-else-Bedingung reinzuprogrammieren, die prüft ob %5 das Verzeichnis ist, in das die gelöschten Daten verschoben wurden (also: Deleted\%date%_%time:~0,2%_%time:~3,2%_%time:~6,2%). Und wenn ja, dann diese Zeile/diesen Ordner ignoriert, dann könnte es ja funktionieren.
Ich kann leider Batch nicht so gut programmieren.
Danke!