Backup-Skript für Robocopy mit datumsabhängigen Zielverzeichnissen
Hallo zusammen,
ich hatte diese Frage zwar bereits im Bereich \IT-Sicherheit & Recht\Backups gepostet, allerdings glaube ich, daß er hier doch besser aufgehoben ist.
Zunächst mal mein Ausgangsposting:
Hallo zusammen!
Ich stehe derzeit vor einem kleinen Problem bzgl. eines durch Skripte automatisierten Backups mit Robocopy und habe über die Suche leider nichts gefunden, was mir bei meinem Problem direkt weiterhelfen könnte, zumal meine persönlichen Skripterfahrungen gegen Null tendieren und die Kenntnisse von Robocopy auch eher rudimentärer Natur sind.
Vielleicht könnte mir ja jemand von Euch einen Tipp geben. Ich wäre Euch jedenfalls sehr dankbar.
Die Daten eines W2k3 Systems sollen im Wochenwechsel auf 2 externe Platten gesichert werden (also Platte 1 in KW 1, Platte 2 in KW 2, Platte 1 in KW 3 und so weiter), inkl. der bestehenden NTFS Berechtigungen und Freigaben.
Als Grundüberlegung für die Datensicherung besteht derzeit folgende Planung:
1. Tagessicherung (Mo-Do)
2. Wochensicherung (KW_ung)
3. Monatssicherung
Kann man etwas derartiges überhaupt noch sinnvoll in ein einzelnes Skript packen?
Die ersten Vollbackups für die Wochentage würden noch per Hand ausgeführt werden und müssten somit nicht zwingend mit in ein Skript eingebunden werden.
Zwecks Vereinfachung gehe ich derzeit auch davon aus, dass ausschließlich ganze Laufwerke gesichert werden sollen und keine einzelnen Verzeichnisse – die Sicherung von einzelnen Verzeichnissen würde ein derartiges Skript m.E. erst recht sprengen, sollte dies überhaupt vernünftig darstellbar sein.
Vielen Dank vorab und schönen Gruß
Noc06
Nach ein wenig rumprobieren (bin wie gesagt absoluter Laie, was das Skripte schreiben betrifft) und Bastelei ist m.E. zumindest im Ansatz etwas brauchbares rausgekommen, was ich auch gerne zwecks Kritik und Verbesserungsvorschlägen hier posten möchte, allerdings würde ich gerne zuvor noch selbst einen Punkt einbauen, bei dem ich derzeit allerdings leider nicht weiterkomme.
Mein Problem liegt momentan darin, daß ich die Abfrage, die zu der separaten Monatssicherung führen soll, nicht zum Laufen bekomme. Biber (thx hierfür nochmal!) war hier so freundlich und hat mir den notwendigen Code gezeigt, nämlich
Ruft man das ganze in der cmd-Line über
auf, erhält man auch gleich das benötigte Datum, welches für einen IF Abgleich nötig wäre (nämlich ist "heutiges datum" = "Monatsletzter"). Leider bekomme ich das aber nicht hin...
Könnte mir bitte jemand von Euch die richtige Schreibweise verraten, in der man einen derartigen Abgleich in ein Skript reinpackt?
Sobald ich den Teil habe, poste ich den Rest von meinem zusammengezimmerten etwas - dann deckt das, wenn auch im Komplettumfang noch nicht getestet, zumindest den Teil meiner ursprünglichen Problemstellung ab.
Vielen Dank vorab und schönen Gruß
Noc06
ich hatte diese Frage zwar bereits im Bereich \IT-Sicherheit & Recht\Backups gepostet, allerdings glaube ich, daß er hier doch besser aufgehoben ist.
Zunächst mal mein Ausgangsposting:
Hallo zusammen!
Ich stehe derzeit vor einem kleinen Problem bzgl. eines durch Skripte automatisierten Backups mit Robocopy und habe über die Suche leider nichts gefunden, was mir bei meinem Problem direkt weiterhelfen könnte, zumal meine persönlichen Skripterfahrungen gegen Null tendieren und die Kenntnisse von Robocopy auch eher rudimentärer Natur sind.
Vielleicht könnte mir ja jemand von Euch einen Tipp geben. Ich wäre Euch jedenfalls sehr dankbar.
Die Daten eines W2k3 Systems sollen im Wochenwechsel auf 2 externe Platten gesichert werden (also Platte 1 in KW 1, Platte 2 in KW 2, Platte 1 in KW 3 und so weiter), inkl. der bestehenden NTFS Berechtigungen und Freigaben.
Als Grundüberlegung für die Datensicherung besteht derzeit folgende Planung:
- Gesichert werden Mo-Do (nachts) in einem separaten Verzeichnis, zunächst erstmalig jeweils als Vollbackup (der Originaldatenbestand würde in diesem Verzeichnis also 4x gespiegelt vorliegen), danach erfolgt nur noch die Sicherung der zu diesem Zeitpunkt geänderten Daten und das auf beiden Platten. Somit wäre eine Rückgriffsmöglichkeit auf den Datenbestand (quasi taggenaue Spiegelung) der letzten 13 Tage jederzeit möglich. Am 14 Tag wird die jeweilige Sicherung wieder überschrieben (Bsp.: am 1. Montag, dem 1.1., findet das erste Montag-Backup auf Platte 1 statt. Am darauffolgenden Montag, dem 8.1., findet das zweite Montag-Backup auf Platte 2 statt. Am dritten Montag, dem 15.1., erfolgt das dritte Montag-Backup wieder auf Platte 1 und überschreibt somit die Sicherung vom 1.1. – die anderen Wochentage erfolgen analog hierzu).
- Freitags erfolgt die Sicherung als Kalenderwoche (KW), ebenfalls in einem separaten Verzeichnis; auf der 1. Platte befinden sich somit (in diesem Beispiel) die ungeraden KW (1.KW, 3.KW,...), wohingegen sich die geraden (2.KW, 4.KW,...) auf der 2. Platte befinden. Die KW Sicherungen sollen alle als Vollsicherungen erhalten bleiben und jeweils mit Datum (ggfs. auch der KW) im Dateinamen gespeichert werden (für ein Kalenderjahr würde dies bei 2 Platten also 26 KW Vollbackups entsprechen).
- Eine weitere Überlegung geht momentan dahin, zusätzlich auch noch ein Vollbackup jeweils am Monatsende durchzuführen und dieses entsprechend mit dem Monatsnamen versehen ebenfalls in einem eigenen Verzeichnis abzulegen.
- Die Verzeichnisstruktur auf den ext. Festplatten würde somit wie folgt aussehen exemplarisch für Platte 1):
1. Tagessicherung (Mo-Do)
2. Wochensicherung (KW_ung)
3. Monatssicherung
Kann man etwas derartiges überhaupt noch sinnvoll in ein einzelnes Skript packen?
Die ersten Vollbackups für die Wochentage würden noch per Hand ausgeführt werden und müssten somit nicht zwingend mit in ein Skript eingebunden werden.
Zwecks Vereinfachung gehe ich derzeit auch davon aus, dass ausschließlich ganze Laufwerke gesichert werden sollen und keine einzelnen Verzeichnisse – die Sicherung von einzelnen Verzeichnissen würde ein derartiges Skript m.E. erst recht sprengen, sollte dies überhaupt vernünftig darstellbar sein.
Vielen Dank vorab und schönen Gruß
Noc06
Nach ein wenig rumprobieren (bin wie gesagt absoluter Laie, was das Skripte schreiben betrifft) und Bastelei ist m.E. zumindest im Ansatz etwas brauchbares rausgekommen, was ich auch gerne zwecks Kritik und Verbesserungsvorschlägen hier posten möchte, allerdings würde ich gerne zuvor noch selbst einen Punkt einbauen, bei dem ich derzeit allerdings leider nicht weiterkomme.
Mein Problem liegt momentan darin, daß ich die Abfrage, die zu der separaten Monatssicherung führen soll, nicht zum Laufen bekomme. Biber (thx hierfür nochmal!) war hier so freundlich und hat mir den notwendigen Code gezeigt, nämlich
' ---- vbsSnippet.vbs
If WScript.arguments.count = 1 Then
dDate=WScript.arguments.item(0)
Else
dDate=Date
End If
Wscript.echo dateAdd ("d", -1, dateAdd("m", 1, "01." & Month(dDate) & "." &year(ddate)))
Ruft man das ganze in der cmd-Line über
cscript //nologo vbsSnippet.vbs
auf, erhält man auch gleich das benötigte Datum, welches für einen IF Abgleich nötig wäre (nämlich ist "heutiges datum" = "Monatsletzter"). Leider bekomme ich das aber nicht hin...
Könnte mir bitte jemand von Euch die richtige Schreibweise verraten, in der man einen derartigen Abgleich in ein Skript reinpackt?
Sobald ich den Teil habe, poste ich den Rest von meinem zusammengezimmerten etwas - dann deckt das, wenn auch im Komplettumfang noch nicht getestet, zumindest den Teil meiner ursprünglichen Problemstellung ab.
Vielen Dank vorab und schönen Gruß
Noc06
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 118683
Url: https://administrator.de/contentid/118683
Ausgedruckt am: 16.11.2024 um 23:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo,
Dein "LastDayOfMonth.vbs" musst Du auch nicht einbauen, ginge aber.
mfg
onegasee59
Dein "LastDayOfMonth.vbs" musst Du auch nicht einbauen, ginge aber.
rem Name der *.vbs erstellen
set "bckTemp=%temp%\LastDayOfMonth.vbs"
rem Befehle die in der *.vbs stehen sollen erstellen
echo If WScript.arguments.count = 1 Then > "%bckTemp%"
echo dDate=WScript.arguments.item(0) >> "%bckTemp%"
echo Else >> "%bckTemp%"
echo dDate=Date >> "%bckTemp%"
echo End If >> "%bckTemp%"
echo Wscript.echo dateAdd ("d", -1, dateAdd("m", 1, "01." & Month(dDate) & "." &year(ddate))) >> "%bckTemp%"
rem wenn Du "%bckTemp%" danach nicht mehr benötigtst, dann letzte Zeile
del /f /s /q "%bckTemp%" > nul
onegasee59
Moin Noc06,
oder aber - um onegasse59s Ansatz konsequent zu (einem vorläufigen) Ende zu führen:
Du bastelst diese zusätzliche Variable "LastdayOfMonth" beispielsweise als %LDoM% mit in die GetAllDateTimeInfos.cmd
Dazu wäre wohl nur die kleine Anpassung nötig:
Die Test-Ausgabe dieser nur oberflächlich getesteten Variante wäre
Grüße
Biber
oder aber - um onegasse59s Ansatz konsequent zu (einem vorläufigen) Ende zu führen:
Du bastelst diese zusätzliche Variable "LastdayOfMonth" beispielsweise als %LDoM% mit in die GetAllDateTimeInfos.cmd
Dazu wäre wohl nur die kleine Anpassung nötig:
....
.....
:: ## In folgender Zeile die Variable %LDoM% zusätzlich:
SET "AllDateTimeVars=DateOrder KW OSKW DoW DoY cDoW DD TT MM JJ YY hh min ss ms LDoM"
...
[...]
....
:: Und der VBS-Schnipsel LIEFERT ein Wert mehr
SET "vbsSnippet=%temp%\%random%.vbs"
>%vbssnippet% echo If wscript.arguments.count = 1 Then dDate=wscript.arguments.item(0) Else dDate=Date
>>%vbsSnippet% echo Wscript.Echo "x," ^& DatePart("ww",dDate,vbSunday,vbFirstFourDays) ^& "," ^&_
>>%vbsSnippet% echo DatePart("ww",dDate) ^& "," ^& DatePart("w",dDate) ^& "," ^& DatePart("y",dDate) ^& "," ^&_
>>%vbssnippet% echo dateAdd ("d", -1, dateAdd("m", 1, "01." ^& Month(dDate) ^& "." ^&year(ddate)))
::## und die FOR-Anweisung HOLT ein Token mehr...
for /F "delims=, tokens=2-6" %%a in ('cscript //nologo %vbsSnippet% %INDate%') do (
(Set "KW=%%a" ) && Rem Kalenderwoche nach verbreiteter Berechnung
(Set "OSKW=%%b" ) && Rem Kalenderwoche nach Betriebssystemvorgaben nicht über GUI änderbar! *lacht
(Set "DoW=%%c" ) && Rem Day of Week 1=Sonntag, 2= Montag... bei meinen REG-Settings
(Set "DoY=%%d" ) && Rem Day of Year, Kalendertag
(Set "LDoM=%%e") && Rem LastDayOfMonth Letzter Tag des Monats
)
:: ##Hier kommt der %LDoM% dazu
del %vbssnippet%
....
.....
Die Test-Ausgabe dieser nur oberflächlich getesteten Variante wäre
>e:\daily\GetAllDateTimeInfos.cmd
INDate=22.06.09
INTime= 7:10:41,67
DateOrder=TT-MM-JJ
KW=25
OSKW=26
DoW=2
DoY=173
cDoW=Mo
DD=22
TT=22
MM=06
JJ=2009
YY=2009
hh=07
min=10
ss=41
ms=67
LDoM=30.06.09 -------> hier isser, der LastDayOfMonth
Grüße
Biber
Moin Noc06,
ich hatte gerade mit den Antworten vor Deinem zweiten Edit angefangen und beziehe mich alo nur auf alles vor "edit2".
Mein Vorschlag wäre dann auch, erstmal zu visualisieren, was schiefgeht beim Vergleich.
Also z.B. die Zeile "if not "%INDate%"=="%LDoM%" echo " so weitergehen zu lassen:
Dann siehst Du doch, was nicht passt.
Grüße
Biber
ich hatte gerade mit den Antworten vor Deinem zweiten Edit angefangen und beziehe mich alo nur auf alles vor "edit2".
Mein Vorschlag wäre dann auch, erstmal zu visualisieren, was schiefgeht beim Vergleich.
Also z.B. die Zeile "if not "%INDate%"=="%LDoM%" echo " so weitergehen zu lassen:
if not "%INDate%"=="%LDoM%" echo Vergleich if not "%INDate%"=="%LDoM%" ergibt NICHT GLEICH.
Dann siehst Du doch, was nicht passt.
Grüße
Biber