ran
Goto Top

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

Content-Key: 41745

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: andyj
andyj Oct 09, 2006 at 13:13:46 (UTC)
Goto Top
Hallo,
schau mal bei heise nach. Die haben ein Script geschrieben zum Backups herstellen mit inkemateller Funktion. Nennt sich "Backup fuer Faule".

Gruss
Member: ran
ran Oct 09, 2006 at 13:25:51 (UTC)
Goto Top
Danke für den Tipp!

Ich hab mir das Script gesucht. leider komm ich mit dem Code noch nicht ganz mit. Könnte ich meins ergänzen dass es funktioniert wie ich es will? Ich kenne leider die Möglichkeiten noch nicht wirklich.

Hier der Code für das BfF von heise:
set Quelle="C:\Dokumente und Einstellungen"
set Ziel="D:\Backup\%date%"
set templog="%temp%\temp.log"
;
echo . >>%windir%\backup.log
echo Starte Backup: %date% %time% von %Quelle% nach %Ziel% >>%windir%\backup.log
md %Ziel%
xcopy %Quelle% %Ziel% /m /s /v /c /i /f /h /k /o /x /y >>%windir%\backup.log
echo Starte Überprüfung >>%windir%\backup.log
start /w windiff.exe -Sdx %templog% -T %Ziel% %quelle%
find "different" %templog% >>%windir%\backup.log
echo Fertig >>%windir%\backup.log
start notepad.exe %windir%\backup.log
;
rem Erstellt 2003 von Axel Vahldiek / c't
rem mailto: axv@ctmagazin.de

Grüsse!
Member: Supaman
Supaman Oct 09, 2006 at 13:37:37 (UTC)
Goto Top
oder du besorgst dir ein replikations-software.
Member: ran
ran Oct 09, 2006 at 13:42:58 (UTC)
Goto Top
Ich möchte es schon mit einem Batch lösen.

Ich habe das Script von heise jetzt mal getestet. Es macht nicht ganz das was ich will. Es macht für jedes Backup einen neuen Ordner. Das soll es ja nicht, da ich nicht bei jedem Herunterfahren eine halbe Stunde warten will, bis meine 26GB Musik kopiert sind.

Und wenn ich in meinem Musik-Ordner was lösche, ist es im Backup immernoch da.

//Edit:
Was macht das Script mit windiff.exe genau? Es vergleicht die beiden Ordner (Quelle/Ziel). Und dann?
Member: andyj
andyj Oct 09, 2006 at 14:10:54 (UTC)
Goto Top
Hallo,
na auf dem 1. Backup ist der Ordner noch da. In den neuen Ordnern ist jeweils nur das Inkrement drin. Mir Windiff wird nur verglichen, was ist neu und alt.
Member: ran
ran Oct 09, 2006 at 14:35:04 (UTC)
Goto Top
Das ist ja eigentlich doof.

Ich möchte nur eine 1 zu 1 Kopie von meinem Ordner "Daten" auf einem anderen Laufwerk. Die Kopie sollte jeden Tag aktualisiert werden.

Ich will auch nicht, dass ich mehrere Kopien habe. Wirklich nur eine "Spiegelung". Geht das nicht per Batch?
Member: miniversum
miniversum Oct 09, 2006 at 15:03:20 (UTC)
Goto Top
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
Member: ghofmann
ghofmann Oct 09, 2006 at 15:34:13 (UTC)
Goto Top
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.
Member: andyj
andyj Oct 10, 2006 at 04:52:42 (UTC)
Goto Top
Hi,
den BAtch umschreiben ist doch kein Problem. Habe das BfF auch auf meine Beduerfnisse angepasst.
Member: ran
ran Oct 10, 2006 at 06:15:16 (UTC)
Goto Top
Irgendwas funktioniert da aber nicht. Fehler erhalte ich aber keine.

Und wie ich da das Loggen rein bringe muss ich mir noch überlegen.

Hier das Script:

@echo off & setlocal
cls
::---------------------------------------
echo Variablen deklarieren.
set quelle="C:\quelle"
set ziel="C:\Backup
::---------------------------------------
echo 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%)==(face-smile 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%)==(face-smile subst %LWdelziel% %ziel% > NUL
if (%ziel:~2,1%)==(\) net use %LWdelziel% %ziel% > NUL
::---------------------------------------
echo Es wird eine Liste aller Dateien und Verzeichnisse im Ziel erzeugt.
echo Dateien und Verzeichnisse werden verglichen.
echo Dateien, die nicht in der Quelle vorhanden sind werden geloescht.
dir /s /b /ad %LWdelziel% >%temp%\Vergleich.Lst
for /F "delims=: tokens=2" %%a in (%temp%\Vergleich.Lst) do if NOT exist %LWdelquelle%\%%a\NUL RD /Q /S "%LWdelziel%%%a"
dir /s /b /a-d %LWdelziel% >%temp%\Vergleich.Lst
for /F "delims=: tokens=2" %%a in (%temp%\Vergleich.Lst) do if NOT exist %LWdelquelle%\%%a del /Q /S "%LWdelziel%%%a"
::---------------------------------------
echo Die Laufwerksbuchstaben für die Quelle und das Ziel werden entfernt.
subst %LWdelquelle% /D > NUL
net use %LWdelquelle% /Delete > NUL
subst %LWdelziel% /D > NUL
net use %LWdelquelle% /Delete > NUL
..---------------------------------------
echo Daten werden von %quelle% nach %ziel% kopiert.
xcopy %quelle% %ziel% /v /f /d /s /e /r /y /z /i


Was könnte da falsch sein?

Grüsse!
Member: miniversum
miniversum Oct 10, 2006 at 12:02:09 (UTC)
Goto Top
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%)==(face-smile 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%)==(face-smile 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
Member: ran
ran Oct 10, 2006 at 17:29:25 (UTC)
Goto Top
Hi

Ich bin jetzt zu Hause und wollte es testen. Nur bekomm ich jetzt einen Fehler. Im Geschäft hats einwandfrei funktioniert.

Es muss irgendwo in diesem Codeabschnitt ein Problem sein:

echo Die Quelle und das Ziel werden als Laufwerke eingebunden.

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%)==(face-smile 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%)==(face-smile subst %LWdelZiel% %Ziel% > NUL
if (%Ziel:~2,1%)==(\) net use %LWdelZiel% %Ziel% > NUL


Die Fehlermeldung lautet: "Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger in Laufwerk ein."

Oder hat das etwas mit Rechten zu tun?

Als Quelle hab ich die Platte E:\ und als Ziel die Platte K:\ angegeben.

Wäre froh, wenn mir jemand helfen könnte.

Grüsse!
Member: miniversum
miniversum Oct 10, 2006 at 18:56:30 (UTC)
Goto Top
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
Member: Filerman
Filerman Nov 02, 2006 at 13:22:18 (UTC)
Goto Top
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