Batch-Skript für die Erstellung einer Sicherung


Vorsorge ist besser als Nachsorge, dies gilt ganz besonders auch für die Sicherung von einzelnen Dateien oder kompletten Verzeichnissen. Eine recht einfache Möglichkeit bietet sich hier unter Windows mit Bordmitteln an. Microsoft stellt die "Windows Server 2003 Resource Kit Tools" kostenlos zur Verfügung, in welchen u.a. das Tool "robocopy.exe" (Robust File Copy Utility) enthalten ist.
Robocopy ist noch um einiges mächtiger als copy/xcopy.

Diese Toolsammlung kann direkt bei Microsoft heruntergeladen werden: Windows Server 2003 Resource Kit Tools.

Eine mögliche Batch-Datei könnte wie folgt aussehen:


@echo off
echo Starte Sicherung...
set Quelle01="D:\Dateien"
set Ziel01="\\192.168.0.210\freigabe\D_Dateien"
set Quelle02="D:\Logfiles"
set Ziel02="\\192.168.0.210\freigabe\D_Logfiles"
set Logfile="robo_log.txt"
c:
cd C:\Programme\Windows Resource Kits\Tools
robocopy %Quelle01% %Ziel01% /E /M /COPY:DAT /LOG:%Logfile% > NUL
robocopy %Quelle02% %Ziel02% /E /M /COPY:DAT /LOG+:%Logfile% > NUL
echo.
echo Sicherung abgeschlossen.
echo.
pause

Was macht nun diese Datei?

Zuerst werden die Variablen Quelle01, Ziel01 und Logfile gesetzt.
Von welchem Ort diese Batchdatei ausgeführt wird ist egal, das Logfile liegt in obigem Beispiel im selben Ordner.
Das Ziel kann entweder auf der selben Festplatte wie das Betriebssystem liegen (nicht empfehlenswert!), oder aber auf einem per USB oder Netzwerk angebundenen Speicher.

Dann wird sicherheitshalber in das Standardinstallationsverzeichnis des Toolkits gewechselt, in welchem das Programm robocopy.exe liegt.

Der Aufruf von robocopy erfolgt nun mit diversen Parametern, die folgende Bedeutung haben:

/EKopiert alle Unterverzeichnisse, auch wenn sie leer sind.
/MKopiert nur Dateien mit gesetztem Archiv-Attribut, und löscht es nach dem Kopieren von der Quelldatei.
/COPY:DATKopiert Daten, Attribute und Zeitstempel.
/LOG:%Logfile%Schreibt die Ausgabe in ein Logfile, und überschreibt eine evtl. vorhandene Datei.
> NULLeitet die Bildschirmausgabe ins "Nichts" (reine Kosmetik).

Robocopy unterstützt noch deutlich mehr Parameter, hier noch ein Auszug an weiteren evtl. nützlichen Funktionen:

/SKopiert Unterverzeichnisse, aber nur wenn sie nicht leer sind.
/LEV:nKopiert nur die obersten n Verzeichnisebenen (n ist die Anzahl).
/PURGELöscht Dateien und Verzeichnisse im Zielordner, die in der Quelle nicht mehr existieren.
/MOVEVerschiebt Dateien und Verzeichnisse, und löscht danach die Quelle.
/MAX:bytesSchliesst Dateien größer als bytes aus.
/MIN:bytesSchliesst Dateien kleiner als bytes aus.
/LOG+:filenameSchreibt die Ausgabe in ein Logfile. Existiert es bereits, wird die Datei erweitert.

Außerdem können in einer Batchdatei mehrere Aufrufe von robocopy mit jeweils anderen Quell- und Zieladressen erfolgen. Dazu muss für jedes weitere Verzeichnis eine eigene Quelle, ein Ziel und ein daran angepasster Aufruf von robocopy in der Datei notiert werden (z.B. Quelle02, Ziel02, ...). Siehe dazu auch die kursiven Erweiterungen des obigen Beispiels.

Die komplette Dokumentation findet sich nach der Installation obiger Datei in C:\Programme\Windows Resource Kits\Tools\robocopy.doc.

Erweiterung des Skripts für taskgesteuerten Betrieb

Ein solcher automatisierter Betrieb würde sich in einem (kleinen) Netzwerk anbieten, in welchem Ordner von mehreren PCs auf einen Linux-Server mit Samba-Freigaben gesichert werden sollen.
Sehr nützlich in diesem Zusammenhang ist ein Server, dessen NIC die Weckfunktion WoL unterstützt. Folgendes Beispiel setzt WoL ein.

Benötigt wird dafür zum einen ein Kommandozeilen-Tool um die speziellen WoL-Pakete zu versenden (beispielsweise MC-WOL), und zum anderen für einen Linux-Server ebenfalls ein Kommandozeilen-Tool um per SSH einen shutdown-Befehl zu senden (→ plink.exe).

Eine Batch-Datei könnte wie folgt aussehen:


@echo off
mc-wol 11:22:33:44:55:66
echo.
echo Warte 60 Sekunden ...
ping 127.0.0.1 -n 61
echo.
echo Starte Sicherung ...
set Quelle01="D:\Dateien"
set Ziel01="\\192.168.0.210\freigabe\D_Dateien"
set Logfile="robo_log.txt"
set plink_dir="C:\Programme\plink"
c:
cd C:\Programme\Windows Resource Kits\Tools
robocopy %Quelle01% %Ziel01% /E /M /COPY:DAT /LOG:%Logfile% > NUL
echo.
echo Sicherung abgeschlossen.
echo.
%plink_dir%\plink -ssh -batch -P 22 -pw PASSWORD USERNAME@192.168.0.210 sudo /sbin/shutdown -h now
echo.
echo Rechner wird heruntergefahren...
echo.

MC-WOL ruft als Erstes das WoL-Tool auf und weckt den Rechner mit der entsprechenden MAC-Adresse.
Anschließend wird für 60 Sekunden ein Ping an localhost gesendet um dem Server genug Zeit zum Booten zu lassen (mit Pings eine Warteschleife zu realisieren ist vielleicht nicht wirklich sinnvoll, aber effektiv...).
Außerdem werden wieder einige "Variablen" gesetzt, in diesem Fall jetzt der übersicht halber auch das Verzeichnis zu plink.exe. Bei Fragen zur Funktion der verschiedenen Parameter hilft die Online-Doku von Plink.
Im Optimalfall legt man für den Shutdown unter Linux einen extra User an, der zur Gruppe "wheel" dazugehören muss um den Rechner herunterfahren zu dürfen (Tipp: sudo). Dieses Skript kann nun zeitgesteuert von einem Windows-Client ausgeführt werden, startet dann den Linux-Server, sichert die entsprechenden Dateien und fährt anschliessend den Server wieder herunter.