seperion
Goto Top

Funktionsprüfung für Backupscript

Das Folgende Skript ist ein Backupscript für einen Kunden. Aufgrund meiner mangelnden Programmiererfahrung möchte ich es ungern im Einsatz sehen bevor ich nicht sicher gegangen bin das es Fehlerfrei funktioniert.
Da ich schon oft in diesem Forum Hilfe gefunden habe, dachte ich mir das ihr mir vielleicht auch bei diesem Problem helfen könnt.
Habe so gut es geht den Quelltext kommentiert.
Hoffe ihr könnt/wollt mir helfen und evtl. sogar noch ein paar tipps geben.

REM Splitten des Datums in Jahr, Monat und Tag Variablen
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%

REM Neu zusammenfügen des Datums zu yyyymmdd
set datum=%jahr%%monat%%tag%

REM Variable zum Löschen der vor 4 Monaten angelegten Sicherungen
set /a del_monat=%monat%-4

REM Fehlerabfangen bei del_Monat < 1
if %del_monat% LSS 1 set /a del_monat=12%del_monat%

REM Quelle und Ziel des Backups festlegen
set source=C:\Daten\
set destination=C:\Tagessicherungen\%monat%\%datum%_Tagesbackup\

REM Folgender Block ist für die Monatssicherung (Pfad soll später variieren)
REM Ziel festlegen und alte Sicherungen löschen
if %tag% == 1 set destination=C:\Monatssicherungen\%monat%\
if %tag% == 1 cd C:\Monatssicherungen\
if %tag% == 1 rd /S /Q %del_monat%
if %tag% == 1 cd C:\Tagessicherungen\
if %tag% == 1 rd /S /Q %del_monat%

REM Der eigentliche "Backupprozess" :-D  
mkdir %destination%
xcopy "%source%*" "%destination%" /e /v /c /i /g /h /r /y >> %destination%%datum%_Backup.log  

[Edit Biber] Codeformatierung für das einfachere Angeben von Zeilennummern nachgetragen. [/Edit]

Content-ID: 146874

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

Biber
Biber 14.07.2010 um 13:27:56 Uhr
Goto Top
Moin Seperion,

im Prinzip ja...

bekannte Knackpunkte/Sollbruchstellen sind immer
  • die Ermittlung von Tag, Monat, Jahr aus einem mehr oder minder zufällig formatierten Textstring "01.04.2010" oder ähnlich, Insbesondere die die Tage/Monatr, die in diesem Stringformat als "08" und "09" rüberkommen, werden von SET /A als Oktal-Zahlen interpretiert und ...na ja, das klappt genauso, als würdest du einen Westerwelle als Vizekanzler interpretieren. RECHNE mit Set /a an diesen Stellen dann statt "set /a delmonat=%monat% - 4" besser "set /a delmonat=1%monat% - 104"

  • Zeile 22+23 mögen logisch zusammenpassen... geht um Monatssicherungen in beiden Zeilen.Zeile 24&25 sieht nach einem Copy&Paste-Fehler aus.

  • in Zeile 28 bekommst du bzw der Backupstarter mit einer Wahrscheinlichkeit wesentlich größer als "selten" eine Fehlermeldung, weil es das Verzeichnis schon gibt. Vorher prüfen mit IF EXIST.

Grüße
Biber
77559
77559 14.07.2010 um 14:01:50 Uhr
Goto Top
Hallo Biber,

ich stimme zu, aber
  • Das sollte wohl If NOT exist ... heissen face-wink
  • wenn der Tag auch zweistellig ist bringt die Abfrage auf 1 nichts, und auf 01 auch nur genau am 1. eines Monats.
  • die Wiederholung des If liesse sich mit einem geklammerten Bereich verhindern
  • Den Monatsübertrag kann man besser in einer Formel die auch Bibers Einwand berücksichtigt schreiben:
Set /A "del_monat=(1%monat%-93) %% 12+1"
  • Die Zahl 93 fasst hierbei -100 -4 -1 +12 zusammen, das %% ist die Rest-Division die so kein negatives Ergebnis entstehen lässt.
Wenn del_monat ebenfalls eine führende Null enthalten soll :
Set /A "del_monat=(1%monat%-93) %% 12 +101"
Set del_monat=%del_monat:~-2%

Gruß
LotPings
Fehler in Formel bei Ergebnis null angepasst.
Biber
Biber 14.07.2010 um 14:51:11 Uhr
Goto Top
Moin LotPings,

Zitat von @77559:
Hallo Biber,

ich stimme zu, aber
Ich liebe Sätze, die so beginnen.
Die Steigerung davon, besonders gern gesehen in Projektmeetings oder auf Parteitagen, ist
"Ergänzend zu den Ausführungen meines Vorredners möchte ich ergänzen.....{zweistündige Abrechnung mit der jüngeren Geschichte}...."

* Das sollte wohl If NOT exist ... heissen face-wink
Nein, natürlich nicht face-wink Ich wollte schreiben "IF EXIST verzeichnis (echo VergissEs>nul ) Else Mkdir Verzeichnis"

....
Set /A "del_monat=(1%monat%-92) %% 12"
  • Die Zahl 92 fasst hierbei -100 -4 +12 zusammen,

Kannst du den Algorithmus nochmal langsam kommen lassen bitte ? face-wink
War das nicht eher "Boah, heute schon der dritte Tag in Folge mit je 36 Grad im Büro...macht schon 92..."

Aber recht Recht hast du natürlich ansonsten mit deinen Hinweisen.

Grüße
Biber
Seperion
Seperion 14.07.2010 um 15:55:15 Uhr
Goto Top
Ich bin ja wirklich froh das es keine Einwände gegen die Grundstruktur gibt.
Ich danke euch hier erstmal für die schnelle Hilfe (, schneller als erwartet).

Werde eure Vorschläge gerne umsetzen und morgen um die Mittagszeit mit einer verbesserten Version aufwarten, zimindest wenn ich ich genug Zeit finde.
Ihr habe mir echt geholfen. Danke

P.S. Weitere Kommentare sind selbstverständlich noch immer gefragt.
mathe172
mathe172 14.07.2010 um 16:09:14 Uhr
Goto Top
Hallo Seperion!

Auf den ersten Blick fält mir auf, dass in Zeile 13 ein "+" nach "12" fehlt (also 12+%del_monat%). Ich weiss es zwar nicht, aber vielleicht solltes du bei einem %del_monat%<10 eine 0 anhängen. (etwa so:
if %del_monat% lss 10 set del_monat=0%del_monat%
). Noch eine Frage: stehen die Monats-Ordner aller Jahre in einem Ordner?
Ausserdem sollten sich die Zeilen 1-10 auf
for /f "tokens=1-3 delims=." %%I in ('echo.%date%') do (  
set datum=%%I%%J%%K
set monat=%%J
set /a del_monat=%%J-4)
ersetzen lassen. (Wenn du es besser findest)
Meines Wissen kommen die Parameter (Zeile 29) direkt nach xcopy, das * solltest du auch weglassen können. Aber ich versteh nicht ganz, was das mit dem >> %dest... .log soll. Kann man das nach xcopy schreiben?

Mathe172
60730
60730 14.07.2010 um 16:14:18 Uhr
Goto Top
moin,
Zitat von @Seperion:
Ich bin ja wirklich froh das es keine Einwände gegen die Grundstruktur gibt.

oh doch...
16. set source=C:\Daten\
17. set destination=C:\T
Wenn Quelle und Ziel auf der gleiche HD oder Partition sind - würde ich das nicht Sicherung nennen wollen.

 21. if %tag% == 1 usw 
würde ich eher so umschiffen...wobei das natürlich eigentlich nicht erst an Stelle 21 stehen sollte.

if %date:~-7,2% gtr 1 if %date:~-7,2% leq 12 if "%tag%"=="1" if exist "C:\Monatssicherungen\%del_monat%"  rd /S /Q C:\Monatssicherungen\%del_monat%  

edit: >>123456789xyz.log bedeutet schreib mir ein Logfile
und da der Parameter ein abschliessendes \ hat - passt das schon - sieht nur schiexxe aus
Und Ob der ganze Jahr monat Kram so überhaupt gebraucht wird - steht in den Sternen - zumindestens das Jahr wird ja nur Erzeugt und nie benutzt/edit

Gruß
77559
77559 14.07.2010 um 16:22:21 Uhr
Goto Top
Zitat von @mathe172:
Auf den ersten Blick fält mir auf, dass in Zeile 13 ein "+" nach "12" fehlt (also 12+%del_monat%).
Vorher ist doch eine Abfrage auf kleiner Null, dann ist doch ein negatives Vorzeichen da face-wink

Mit meiner Fromel erübrigt sich aber die Abfrage da das Ergebns bei einer Modulo-(=Rest) Division immer Positiv ist.

Du kannst es hiermit gerne nachprüfen:
@Echo off&Setlocal EnableDelayedExpansion
For %%A in (01 02 03 04 05 06 07 08 09 10 11 12) do Set /A "x=(1%%A -93) %% 12+1"&Echo Monat %%A del_monat !x!  
Ausgabe:
>\test\test.cmd
Monat 01 del_monat 9
Monat 02 del_monat 10
Monat 03 del_monat 11
Monat 04 del_monat 12
Monat 05 del_monat 1
Monat 06 del_monat 2
Monat 07 del_monat 3
Monat 08 del_monat 4
Monat 09 del_monat 5
Monat 10 del_monat 6
Monat 11 del_monat 7
Monat 12 del_monat 8
Gruß
LotPings

Peinlich wenn sich selber überführt face-wink Formel angepasst - jetzt stimmt es.
Seperion
Seperion 15.07.2010 um 16:43:26 Uhr
Goto Top
set jahr=%date:~-4% 
set monat=%date:~-7,2% 
set tag=%date:~-10,2% 
set datum=%jahr%%monat%%tag% 
set /a monat=%monat%

set /a del_monatssicherung=%monat%-6
if %del_monatssicherung% LSS 1 set /a del_monatssicherung=12+%del_monatssicherung% 

set /a del_tagessicherung=%monat%-2
if %del_tagessicherung% LSS 1 set /a del_tagessicherung=12+%del_tagessicherung%

set source=C:\Daten\ 
set destination=C:\Tagessicherungen\%monat%\%datum%_Tagesbackup\ 

if %tag% == 01 (
	set destination=C:\Monatssicherungen\%monat%\ 
	cd C:\Monatssicherungen\ 
	rd /S /Q %del_monatssicherung% 
	cd C:\Tagessicherungen\ 
	rd /S /Q %del_tagessicherung% 
)

if not exist %destination% mkdir %destination% 
xcopy "%source%*" "%destination%" /e /v /c /i /g /h /r /y >> %destination%%datum%_Backup.log  

So ich habe versucht alle Anmerkungen von euch einzupflegen bin aber noch nicht zum Test gekommen.

Erledigt ist:
  • Bullet Die Werte für die Löschung von Tages- und Monatssicherung angepasst. Dementsprechen auch die Variablen angepasst.
  • Bullet Das IF geklammert.
  • Bullet Auf bereits vorhandenen Ordner geprüft.
  • Bullet Es wird nun auf den Tag 01 statt 1 geprüft. Da ich ja nicht mit der variabel %tag% rechne sollte es ein String sein und daher noch eine führende Null enthalten, oder?
  • Bullet Die sache mit der Führenden Null bei den Ordnerbezeichnungen (bzw. fehlenden Führenden Null bei der berechnung von %del_Monatssicherung% und %del_Tagessicherung%. Hab nach "set datum..." einfach die Null aus %monat% entfernt. face-wink

Nicht eingebaut:
  • Bullet Alles was mit Modulo zu tun hat. Ist mir ehrlich gesagt einfach zu stressig wenn ich ne änderung an den Laufzeiten der Backup machen will. Ich könnte natürlich einfach mit Variablen Arbeiten, aber warum der Aufwand?
  • Bullet Änderung der Pfade. Ja ist auf der selben Platte. Macht mir den Test auf meinem Rechner aber einfacher. Werd ich ändern wenns beim Kunden in Einsatz kommt. Da gibts ein NAS welches via Netzlaufwerk angebunden ist.

So ich hoffe ich habe an alles gedacht. Schau heute Abend noch mal rein und ergänze eventuell fehlendes.
Wenn ich jetzt in der eile Fehler eingebaut habe, bitte melden...
...und Danke nochmal.

Seperion
Biber
Biber 15.07.2010 um 18:39:40 Uhr
Goto Top
Moin Seperion,

ic habe jetzt auc nur einen oberflächlichen Blick auf das neue Skript geworfen.
Ins Auge stechen mir auf jeden Fall die Zeilen 16-22... die sind grenzwertig bzw. Schönwetterzeilen.

Konkret - ich würde statt jetzt
...
if %tag% == 01 (
	set destination=C:\Monatssicherungen\%monat%\ 
	cd C:\Monatssicherungen\ 
	rd /S /Q %del_monatssicherung% 
	cd C:\Tagessicherungen\ 
	rd /S /Q %del_tagessicherung% 
)
...
...eher formulieren:
:: ganz oben einmalig
Set "RootMonatsSich=C:\Monatssicherungen"  & :: jeweils ohne abschliessenden Backslash
Set "RootTagesSich=C:\Tagessicherungen"     & :: das macht die zusammengesetzten Pfade unten lesbarer
...
...
if "%tag%" == "01" (
	rd /S /Q "%RootMonatsSich%\%del_monatssicherung%"
	rd /S /Q "%RootTagesSich%\%del_tagessicherung%"
	set "destination=%RootMonatsSich%\%monat%\"
)
...
  • die beiden Vergleichswert beim "IF ==" habe ich in Anführungszeichen gesetzt, weil die sonst einen Syntaxfehler bekommst, wenn %tag% leer ist.
Bei mir am Rechner wäre %tag% leer, denn ich habe das Datum 8stellig eingestellt ("15.07.10") und dein Tag ist "set tag=%date:~-10,2%"

  • diese Verzeichniswexelei mit "cd"....a) überflüssig und b) befindet sich der Batch am Ende/bei Abbruch in einem anderen Verzeichnis als beim Start.
Das klappt erfahrungsgemäß nie...außer bei Schönwetter.

  • die "Wurzelverzeichnisse" der Tages- und Monatssicherungen verwendest du mehrfach -> nimm sie in Variablen.
Denn die haben auch noch so tippfehlerträchtige Namen... wenn du an einer Stelle im Sourcecode stehen hast "C:\Monatssicherungen" (mit "ss" in der Mitte) und an anderer Stelle "c:\Monatsicherungen" (mit einem "s" zwischen "Monat" und "sicherungen" --> den Fehler merkst du erst bei der ersten Monatssicherung.

Grüße
Biber
Seperion
Seperion 24.07.2010 um 13:00:09 Uhr
Goto Top
Gut. Bin gerade im Urlaub in Spanien. Mit dem WLAN ist's hier nicht besonderst gut. Mal da mal wieder wech...
Desshalb hats etwas gedauert.
Habe den Code noch nahc Biber's vorschlägen abgeändert und beende hiermit diesen Beitrag als gelöst.
Danke nocheinmal für eure Mühe und Hilfe.

set jahr=%date:~-4% 
set monat=%date:~-7,2% 
set tag=%date:~-10,2% 
set datum=%jahr%%monat%%tag% 
set /a monat=%monat%

set "RootMonSicherung=C:\Monatssicherung"  
set "RootTagSicherung=C:\Tagessicherung"  

set /a del_monatssicherung=%monat%-6
if %del_monatssicherung% LSS 1 set /a del_monatssicherung=12+%del_monatssicherung% 

set /a del_tagessicherung=%monat%-2
if %del_tagessicherung% LSS 1 set /a del_tagessicherung=12+%del_tagessicherung%

set source=C:\Daten\ 
set destination=%RootTagSicherung%\%monat%\%datum%_Tagesbackup\ 

if "%tag%" == "01" (  
	set destination=%RootMonSicherung%\%monat%\  
	rd /S /Q "%RootMonSicherung%\%del_monatssicherung%"  
	rd /S /Q "%RootTagSicherung%\%del_tagessicherung%"  
)

if not exist %destination% mkdir %destination% 
xcopy "%source%*" "%destination%" /e /v /c /i /g /h /r /y >> %destination%%datum%_Backup.log  

Grüße Seperion
Biber
Biber 24.07.2010 um 13:45:42 Uhr
Goto Top
Moin Seperion,

danke für dein Feedback.

Aber dennoch: Du bist im Urlaub in Spanien und verfeinerst Backupskriptchen für die Firma?

Bitte denke daran, dass wir 'Schländer schon ein ganz bedenkliches Image im Ausland haben.

Wenn dein WLAN wieder mal eine gute Verbindung hat->suchmaschine mal nach "Urlaub" *gg

Liebe Grüße und lass den blöden Rechner im Hotelsafe.
Biber