Automatisiertes Backup-Skript für NAS-Laufwerk mit Datumskontrolle
Zweck:
Dieses Batch-Skript automatisiert den Backup-Prozess für ein Verzeichnis auf einem NAS-Laufwerk.
Es stellt sicher, dass Backups nur durchgeführt werden, wenn seit dem letzten Backup mindestens 7 Tage vergangen sind. Das Skript verwendet die Samba-Freigabe, um auf das NAS zuzugreifen, und protokolliert den Backup-Status in einer Log-Datei.
1. Variablen:NAS_PATH: Pfad zur Samba-Freigabe des NAS.USERNAME und PASSWORD: Zugangsdaten für das NAS.BACKUP_PATH: Zielpfad für das Backup.LOGFILE: Pfad zur Log-Datei, die alle Backup-Prozesse aufzeichnet.DATE_FILE: Speichert das Datum des letzten Backups.
2. Log- und Datumspfad erstellen:
Das Skript prüft, ob der Ordner C:\BackupLogs existiert. Falls nicht, wird er erstellt, um Logs und das Datum zu speichern.
3. Aktuelles Datum abrufen:
Das Skript verwendet den wmic-Befehl, um das aktuelle Datum zu erhalten und in der Variable CUR_DATE zu speichern (im Format yyyyMMdd).
4. Letztes Backup-Datum prüfen:
Falls bereits ein vorheriges Backup-Datum gespeichert ist, wird es aus der Datei %DATE_FILE% geladen.
Falls keine Datei vorhanden ist, wird der Wert auf 0 gesetzt, und es wird eine Nachricht ausgegeben, dass kein vorheriges Backup gefunden wurde.
5. Unterschied in Tagen berechnen:
Das Skript berechnet die Anzahl der Tage seit dem letzten Backup, indem es das aktuelle Datum und das gespeicherte Datum des letzten Backups vergleicht.
Es verwendet powershell und New-TimeSpan, um die Differenz zu berechnen.
6. Backup nur durchführen, wenn 7 Tage vergangen sind:
Wenn der Unterschied in Tagen kleiner als 7 ist, wird das Backup übersprungen, und eine entsprechende Nachricht wird ausgegeben.
Wenn mehr als 7 Tage seit dem letzten Backup vergangen sind, wird das Backup durchgeführt.
7. Samba-Freigabe einbinden:
Das Skript verwendet den net use-Befehl, um die Samba-Freigabe (NAS) mit den angegebenen Zugangsdaten zu verbinden.
8. Backup ausführen:
Das Skript sichert alle Benutzerverzeichnisse aus C:\Users\* (mit xcopy) in den angegebenen Backup-Pfad auf dem NAS.
Es werden folgende Optionen verwendet:/E: Alle Verzeichnisse und Unterverzeichnisse./H: Auch versteckte Dateien./C: Fehler ignorieren./I: Wenn der Zielort ein Verzeichnis ist, wird dies automatisch angenommen./D: Nur geänderte Dateien werden kopiert./Y: Bestätigt automatisch das Überschreiben von Dateien.
9. Samba-Freigabe trennen:
Nach dem Backup wird die Samba-Freigabe mit net use Z: /delete wieder getrennt.
10. Letztes Backup-Datum aktualisieren:
Das Skript speichert das aktuelle Datum (CUR_DATE) in der Datei %DATE_FILE%, um das Datum des letzten Backups zu aktualisieren.
11. Abschluss:
Das Skript gibt eine Nachricht aus, dass das Backup erfolgreich abgeschlossen wurde.
Es pausiert, damit der Benutzer die Ergebnisse in der Konsole sehen kann.
⚠️ Hinweis: Das Skript benötigt Administratorrechte auf dem Windows-System, um auf das Netzwerk (NAS) zuzugreifen und mit xcopy die Daten zu sichern.
Backup.bat
@echo off
:: -----------------------------------------------------------------------------
:: Copyright (C) 2024 Andre Zimmermann
:: This script is licensed under the GNU General Public License (GPL).
:: You can redistribute it and/or modify it under the terms of the GPL.
:: This script is distributed in the hope that it will be useful,
:: but WITHOUT ANY WARRANTY; without even the implied warranty of
:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
:: -----------------------------------------------------------------------------
:: Variablen
set NAS_PATH=\\192.168.1.33\PFAD\zum\Backupverzeischniss
set USERNAME=BENUTZER
set PASSWORD=GEHEIM
set BACKUP_PATH=Z:\Backup\PC
set LOGFILE=C:\BackupLogs\backup_log.txt
set DATE_FILE=C:\BackupLogs\last_backup_date.txt
:: Log- und Datumspfad erstellen, falls nicht vorhanden
if not exist C:\BackupLogs mkdir C:\BackupLogs
:: Aktuelles Datum abrufen
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value ^| find "="') do set CUR_DATE=%%I
set CUR_DATE=%CUR_DATE:~0,8%
:: Letztes Backup-Datum prüfen
if exist "%DATE_FILE%" (
set /p LAST_DATE=<"%DATE_FILE%"
echo Letztes Backup-Datum: %LAST_DATE%
) else (
set LAST_DATE=0
echo Keine vorherigen Backups gefunden.
)
:: Unterschied in Tagen berechnen
set /a DAYS_DIFF=0
if not "%LAST_DATE%"=="0" (
powershell -Command "(New-TimeSpan -Start ([datetime]::ParseExact('%LAST_DATE%', 'yyyyMMdd', $null)) -End ([datetime]::ParseExact('%CUR_DATE%', 'yyyyMMdd', $null))).Days" > diff.tmp
set /p DAYS_DIFF=<diff.tmp
del diff.tmp
)
echo Tage seit letztem Backup: %DAYS_DIFF%
:: Backup nur durchführen, wenn 7 Tage vergangen sind
if %DAYS_DIFF% LSS 7 (
echo Kein Backup erforderlich. Letztes Backup war vor %DAYS_DIFF% Tagen.
goto END
)
:: Samba-Freigabe einbinden
net use Z: %NAS_PATH% /user:%USERNAME% %PASSWORD% /persistent:no
if %ERRORLEVEL% NEQ 0 (
echo Fehler: Verbindung zum NAS konnte nicht hergestellt werden.
goto END
)
:: Backup ausführen
echo Backup gestartet am %CUR_DATE% um %time% >> "%LOGFILE%"
for /d %%U in (C:\Users\*) do (
echo Sichern von %%U...
xcopy "%%U" "%BACKUP_PATH%\%%~nU" /E /H /C /I /D /Y >> "%LOGFILE%" 2>&1
)
:: Samba-Freigabe trennen
net use Z: /delete
:: Letztes Backup-Datum aktualisieren
echo %CUR_DATE% > "%DATE_FILE%"
echo Backup erfolgreich abgeschlossen am %CUR_DATE% um %time%. >> "%LOGFILE%"
:END
echo Fertig.
pause
