Datensicherung mit Batch (incrementel)
Musik und Fotos auf ein anderes Laufwerk sichern
Hallo zusammen!
Cooles Board hier! Ich hoffe, dass ich hier eine Antwort auf meine Frage finde. Bin optimistisch ;).
Ich möchte bei jedem Herunterfahren meines PCs, meine Musik und meine Fotos auf dem Computer auf eine andere Festplatte sichern. Es sollte aber nicht immer meine ganze Musik-Sammlung kopieren, sondern nur das neu dazugekommene.
Ich möchte aber nicht nur xcopy /d machen, da die Lieder, die ich herausgelöscht habe ja dann in der Sicherung immernoch vorhanden sind.
Habe mir einmal folgendes gemacht:
@echo off
cls
rem ---------------------------------------
rem Name: MyBackup.bat
rem Autor: Raphael Nussbaum
rem Datum: 09. Oktober 2006
rem ---------------------------------------
echo Variablen deklarieren.
set programmpfad=C:\MyBackup
set logpfad=%programmpfad%\Logfiles
set log=%logpfad%\MyBackup.log
set error=%logpfad%\Copyerror.log
set quellpfad=C:\quelle
set zielpfad=C:\Backup
rem ---------------------------------------
echo Ordnerstruktur wird eingerichtet.
if not exist %programmpfad% md %programmpfad%
if not exist %logpfad% md %logpfad%
if not exist %log% MyBackup-Log >> %log%
if not exist %error% Fehler-Log >> %error%
if not exist %quellpfad% echo Der angegebene Quellpfad ist falsch!
if not exist %zielpfad% md %zielpfad%
if exist %zielpfad%\backup.new rd /s/q %zielpfad%\backup.new
md %zielpfad%\backup.new
rem ---------------------------------------
echo Datum in die Logdatei schreiben.
echo ----------------------------- > %log%
echo %date% %time% >> %log%
echo ============================= >> %log%
rem ---------------------------------------
echo Daten werden kopiert.
xcopy %quellpfad%\*.* %zielpfad%\backup.new\ /s /e /h /o /r /y /d /v /i >> %log% 2>> %error%
if %errorlevel% GTR 1 goto fehler1
if %errorlevel% GTR 2 goto fehler2
if %errorlevel% GTR 3 goto fehler3
if %errorlevel% GTR 4 goto fehler4
rem ---------------------------------------
echo Alte Daten werden geloescht. Neuer Datenblock verschoben.
if exist %zielpfad%\backup rd /s /q %zielpfad%\backup
move %zielpfad%\backup.new %zielpfad%\backup
goto end
rem ---------------------------------------
rem Fehlertexte
:fehler1
echo Es wurden keine zu kopierenden Dateien gefunden.
:fehler2
echo Der Benutzer hat xcopy durch Drücken von STRG+C abgebrochen.
:fehler3
echo Es ist ein Initialisierungsfehler aufgetreten. Es steht nicht genügend Speicherplatz auf dem Datenträger oder im Arbeitsspeicher zur Verfügung, Sie haben eine ungültige Laufwerkbezeichnung eingegeben oder eine unzulässige Syntax in der Befehlszeile verwendet.
:fehler4
echo Beim Schreiben auf den Datenträger ist ein Fehler aufgetreten.
rem ---------------------------------------
:end
rem Abschluss
echo Das Backup wurde ohne Fehler erstellt!
echo Ende - %date% %time% >> %log%
echo ----------------------------- >> %log%
echo Die Logdateien befinden sich im Programmordner (%logpfad%)
Dazu ist vielleicht noch zu sagen, dass dies mein erstes .bat-Script ist ;).
Jedoch ist das glaube ich nicht die richtige Lösung.
Kann mir jemand helfen?
Gruss
Hallo zusammen!
Cooles Board hier! Ich hoffe, dass ich hier eine Antwort auf meine Frage finde. Bin optimistisch ;).
Ich möchte bei jedem Herunterfahren meines PCs, meine Musik und meine Fotos auf dem Computer auf eine andere Festplatte sichern. Es sollte aber nicht immer meine ganze Musik-Sammlung kopieren, sondern nur das neu dazugekommene.
Ich möchte aber nicht nur xcopy /d machen, da die Lieder, die ich herausgelöscht habe ja dann in der Sicherung immernoch vorhanden sind.
Habe mir einmal folgendes gemacht:
@echo off
cls
rem ---------------------------------------
rem Name: MyBackup.bat
rem Autor: Raphael Nussbaum
rem Datum: 09. Oktober 2006
rem ---------------------------------------
echo Variablen deklarieren.
set programmpfad=C:\MyBackup
set logpfad=%programmpfad%\Logfiles
set log=%logpfad%\MyBackup.log
set error=%logpfad%\Copyerror.log
set quellpfad=C:\quelle
set zielpfad=C:\Backup
rem ---------------------------------------
echo Ordnerstruktur wird eingerichtet.
if not exist %programmpfad% md %programmpfad%
if not exist %logpfad% md %logpfad%
if not exist %log% MyBackup-Log >> %log%
if not exist %error% Fehler-Log >> %error%
if not exist %quellpfad% echo Der angegebene Quellpfad ist falsch!
if not exist %zielpfad% md %zielpfad%
if exist %zielpfad%\backup.new rd /s/q %zielpfad%\backup.new
md %zielpfad%\backup.new
rem ---------------------------------------
echo Datum in die Logdatei schreiben.
echo ----------------------------- > %log%
echo %date% %time% >> %log%
echo ============================= >> %log%
rem ---------------------------------------
echo Daten werden kopiert.
xcopy %quellpfad%\*.* %zielpfad%\backup.new\ /s /e /h /o /r /y /d /v /i >> %log% 2>> %error%
if %errorlevel% GTR 1 goto fehler1
if %errorlevel% GTR 2 goto fehler2
if %errorlevel% GTR 3 goto fehler3
if %errorlevel% GTR 4 goto fehler4
rem ---------------------------------------
echo Alte Daten werden geloescht. Neuer Datenblock verschoben.
if exist %zielpfad%\backup rd /s /q %zielpfad%\backup
move %zielpfad%\backup.new %zielpfad%\backup
goto end
rem ---------------------------------------
rem Fehlertexte
:fehler1
echo Es wurden keine zu kopierenden Dateien gefunden.
:fehler2
echo Der Benutzer hat xcopy durch Drücken von STRG+C abgebrochen.
:fehler3
echo Es ist ein Initialisierungsfehler aufgetreten. Es steht nicht genügend Speicherplatz auf dem Datenträger oder im Arbeitsspeicher zur Verfügung, Sie haben eine ungültige Laufwerkbezeichnung eingegeben oder eine unzulässige Syntax in der Befehlszeile verwendet.
:fehler4
echo Beim Schreiben auf den Datenträger ist ein Fehler aufgetreten.
rem ---------------------------------------
:end
rem Abschluss
echo Das Backup wurde ohne Fehler erstellt!
echo Ende - %date% %time% >> %log%
echo ----------------------------- >> %log%
echo Die Logdateien befinden sich im Programmordner (%logpfad%)
Dazu ist vielleicht noch zu sagen, dass dies mein erstes .bat-Script ist ;).
Jedoch ist das glaube ich nicht die richtige Lösung.
Kann mir jemand helfen?
Gruss
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 41745
Url: https://administrator.de/contentid/41745
Ausgedruckt am: 08.11.2024 um 05:11 Uhr
14 Kommentare
Neuester Kommentar
Ok jetzt die Lösung ohne zusätzliche exe und so... allerdings ohne log, das müßtest du noch selbst ein-/umbauen. Sind ja nur 3 oder 4 Stellen.
Guckst du da ;) :
Synchronisation einer Ordnerstruktur
miniversum
Guckst du da ;) :
Synchronisation einer Ordnerstruktur
miniversum
In der c't ist mal eine rsync-basierte Lösung ftplicity bzw. duplicity vorgestellt worden, Link:
http://www.heise.de/ct/06/13/links/216.shtml
Hoffe, das ist jetzt nicht das gleiche wie "Backup für Faule", das weiter oben schon mal erwähnt worden ist.
Falls es für Dich in Frage kommt, ein zusätzliches Programm zu erwerben, würde ich 2BrightSparks SyncBack Pro empfehlen. Microsoft's SyncToy wär von den Features her ähnlich und sogar umsonst, ist aber m.E. leider ziemlich buggy.
http://www.heise.de/ct/06/13/links/216.shtml
Hoffe, das ist jetzt nicht das gleiche wie "Backup für Faule", das weiter oben schon mal erwähnt worden ist.
Falls es für Dich in Frage kommt, ein zusätzliches Programm zu erwerben, würde ich 2BrightSparks SyncBack Pro empfehlen. Microsoft's SyncToy wär von den Features her ähnlich und sogar umsonst, ist aber m.E. leider ziemlich buggy.
Was funktioniert den nicht? Der kopier Teil oder der lösch Teil?
Mit Log könnts so aussehen:
@echo off & setlocal
set Quelle="E:\quelle"
set Ziel="E:\ziel"
set Logfile="E:\Log.txt"
:: Quelle und Ziel als Laufwerke einbinden
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL set LWdelquelle=%%L:
if %LWdelquelle.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
goto eof
)
if (%Quelle:~2,1%)==( subst %LWdelquelle% %Quelle% > NUL
if (%Quelle:~2,1%)==(\) net use %LWdelQuelle% %Quelle% > NUL
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL set LWdelZiel=%%L:
if %LWdelZiel.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
goto eof
)
if (%Ziel:~2,1%)==( subst %LWdelZiel% %Ziel% > NUL
if (%Ziel:~2,1%)==(\) net use %LWdelZiel% %Ziel% > NUL
echo Sicherung vom %Date% %Time% >%Logfile%
:: Eine Liste alles Dateien und Verzeichnisse im Ziel erzeugen
:: Danach alle Dateien und Verzeichnisse die nicht in der Quelle vorhanden sind löschen
dir /s /b /ad %LWdelZiel% >%temp%\OnlyInTarget.Lst
for /F "delims=: tokens=2" %%a in (%temp%\OnlyInTarget.Lst) do if NOT exist %LWdelQuelle%\%%a\NUL RD /Q /S "%LWdelZiel%%%a" & echo "%LWdelZiel%%%a" entfernt>>%Logfile%
dir /s /b /a-d %LWdelZiel% >%temp%\OnlyInTarget.Lst
for /F "delims=: tokens=2" %%a in (%temp%\OnlyInTarget.Lst) do if NOT exist %LWdelQuelle%\%%a del /Q /S "%LWdelZiel%%%a" & echo "%LWdelZiel%%%a" entfernt>>%Logfile%
:: Laufwerksbuchstaben für Quelle und Ziel entfernen
subst %LWdelquelle% /D > NUL
net use %LWdelquelle% /Delete > NUL
subst %LWdelZiel% /D > NUL
net use %LWdelquelle% /Delete > NUL
:: Jetzt die Dateien die von Quelle nach Ziel kopieren
echo Kopierte/ERsetzte Dateien:>>%Logfile%
xcopy %Quelle% %Ziel% /v /f /d /s /e /r /y /z /i /l >>%Logfile%
xcopy %Quelle% %Ziel% /v /f /d /s /e /r /y /z /i
miniversum
Mit Log könnts so aussehen:
@echo off & setlocal
set Quelle="E:\quelle"
set Ziel="E:\ziel"
set Logfile="E:\Log.txt"
:: Quelle und Ziel als Laufwerke einbinden
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL set LWdelquelle=%%L:
if %LWdelquelle.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
goto eof
)
if (%Quelle:~2,1%)==( subst %LWdelquelle% %Quelle% > NUL
if (%Quelle:~2,1%)==(\) net use %LWdelQuelle% %Quelle% > NUL
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL set LWdelZiel=%%L:
if %LWdelZiel.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
goto eof
)
if (%Ziel:~2,1%)==( subst %LWdelZiel% %Ziel% > NUL
if (%Ziel:~2,1%)==(\) net use %LWdelZiel% %Ziel% > NUL
echo Sicherung vom %Date% %Time% >%Logfile%
:: Eine Liste alles Dateien und Verzeichnisse im Ziel erzeugen
:: Danach alle Dateien und Verzeichnisse die nicht in der Quelle vorhanden sind löschen
dir /s /b /ad %LWdelZiel% >%temp%\OnlyInTarget.Lst
for /F "delims=: tokens=2" %%a in (%temp%\OnlyInTarget.Lst) do if NOT exist %LWdelQuelle%\%%a\NUL RD /Q /S "%LWdelZiel%%%a" & echo "%LWdelZiel%%%a" entfernt>>%Logfile%
dir /s /b /a-d %LWdelZiel% >%temp%\OnlyInTarget.Lst
for /F "delims=: tokens=2" %%a in (%temp%\OnlyInTarget.Lst) do if NOT exist %LWdelQuelle%\%%a del /Q /S "%LWdelZiel%%%a" & echo "%LWdelZiel%%%a" entfernt>>%Logfile%
:: Laufwerksbuchstaben für Quelle und Ziel entfernen
subst %LWdelquelle% /D > NUL
net use %LWdelquelle% /Delete > NUL
subst %LWdelZiel% /D > NUL
net use %LWdelquelle% /Delete > NUL
:: Jetzt die Dateien die von Quelle nach Ziel kopieren
echo Kopierte/ERsetzte Dateien:>>%Logfile%
xcopy %Quelle% %Ziel% /v /f /d /s /e /r /y /z /i /l >>%Logfile%
xcopy %Quelle% %Ziel% /v /f /d /s /e /r /y /z /i
miniversum
Das kann an der
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do
Schleife leigen. Hier wird ja nach freien laufwerksbuchstaben gesucht und wen einer gefunden wird dieser benutzt.
Schau mal welche bei dir benutzt werden und las mal das ausführen:
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL echo %%L
Wenn der Buchstabe auf ein CD oder DVD Laufwerk verweist geht da was schief.
Dann dreh einfachmal die reihenfolge um oder lass die ersten paar Buchstaben weg udn fang erst bei g oder so an.
An den Rechten kanns auch liegen, da die Verzeichnisse, in deinem Fall die Laufwerke E und K, mit subst auf andere Laufwerksbuchstaben zusätzlich geleitet werden (macht halt nur Sinn bei Verzeichnissen, stört aber auch nicht). Erlauben das deine Rechte nicht gehts auch nicht gut.
Kannst du die Problemstelle noch genauer einschränken?
miniversum
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do
Schleife leigen. Hier wird ja nach freien laufwerksbuchstaben gesucht und wen einer gefunden wird dieser benutzt.
Schau mal welche bei dir benutzt werden und las mal das ausführen:
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL echo %%L
Wenn der Buchstabe auf ein CD oder DVD Laufwerk verweist geht da was schief.
Dann dreh einfachmal die reihenfolge um oder lass die ersten paar Buchstaben weg udn fang erst bei g oder so an.
An den Rechten kanns auch liegen, da die Verzeichnisse, in deinem Fall die Laufwerke E und K, mit subst auf andere Laufwerksbuchstaben zusätzlich geleitet werden (macht halt nur Sinn bei Verzeichnissen, stört aber auch nicht). Erlauben das deine Rechte nicht gehts auch nicht gut.
Kannst du die Problemstelle noch genauer einschränken?
miniversum
Hallo,
spontan faellt mir da sofort ein kostenloses Microsoft Tool ein (robocopy.exe). Mit diesem Tool kann
man Dateien in einem Ziellaufwerk immer 1:1 haben wie in dem Quellenlaufwerk.
Beispiel:
robocopy c:\Quelle d:\Ziel *.* /mir
/mir = Mirror (loescht im Ziel!)
ueberprueft welche Dateien im Verzeichnis Quelle sind und noch im Verzeichnis Ziel fehlen.
Aber Vorsicht! Wenn man als Zielverzeichnis ein Verzeichnis angibt in dem sich noch andere Dateien / Verzeichnisse
befinden, werden diese sofort geloescht, sie existieren ja nicht in der Quelle. Also am besten als Zielverzeichnis
ein leeres Verzeichnis angeben.
robocopy /??? | more bringt eine gute Hilfe in die noch zusaetzlichen Moeglichkeiten von "Robust Copy".
Mehr auch hier: http://support.microsoft.com/kb/160513/de
Gruss Filerman
spontan faellt mir da sofort ein kostenloses Microsoft Tool ein (robocopy.exe). Mit diesem Tool kann
man Dateien in einem Ziellaufwerk immer 1:1 haben wie in dem Quellenlaufwerk.
Beispiel:
robocopy c:\Quelle d:\Ziel *.* /mir
/mir = Mirror (loescht im Ziel!)
ueberprueft welche Dateien im Verzeichnis Quelle sind und noch im Verzeichnis Ziel fehlen.
Aber Vorsicht! Wenn man als Zielverzeichnis ein Verzeichnis angibt in dem sich noch andere Dateien / Verzeichnisse
befinden, werden diese sofort geloescht, sie existieren ja nicht in der Quelle. Also am besten als Zielverzeichnis
ein leeres Verzeichnis angeben.
robocopy /??? | more bringt eine gute Hilfe in die noch zusaetzlichen Moeglichkeiten von "Robust Copy".
Mehr auch hier: http://support.microsoft.com/kb/160513/de
Gruss Filerman