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.
[Edit Biber] Codeformatierung für das einfachere Angeben von Zeilennummern nachgetragen. [/Edit]
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]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 146874
Url: https://administrator.de/contentid/146874
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
11 Kommentare
Neuester Kommentar
Moin Seperion,
im Prinzip ja...
bekannte Knackpunkte/Sollbruchstellen sind immer
Grüße
Biber
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
Hallo Biber,
ich stimme zu, aber
Gruß
LotPings
Fehler in Formel bei Ergebnis null angepasst.
ich stimme zu, aber
- Das sollte wohl
If NOT exist ...
heissen - 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.
Set /A "del_monat=(1%monat%-93) %% 12 +101"
Set del_monat=%del_monat:~-2%
Gruß
LotPings
Fehler in Formel bei Ergebnis null angepasst.
Moin LotPings,
Die Steigerung davon, besonders gern gesehen in Projektmeetings oder auf Parteitagen, ist
Kannst du den Algorithmus nochmal langsam kommen lassen bitte ?
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
Zitat von @77559:
Hallo Biber,
ich stimme zu, aber
Ich liebe Sätze, die so beginnen.Hallo Biber,
ich stimme zu, aber
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
Nein, natürlich nicht Ich wollte schreiben "IF EXIST verzeichnis (echo VergissEs>nul ) Else Mkdir Verzeichnis"If NOT exist ...
heissen ....
Set /A "del_monat=(1%monat%-92) %% 12"
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 ?
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
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:
). Noch eine Frage: stehen die Monats-Ordner aller Jahre in einem Ordner?
Ausserdem sollten sich die Zeilen 1-10 auf
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
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%
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)
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
moin,
oh doch...
würde ich eher so umschiffen...wobei das natürlich eigentlich nicht erst an Stelle 21 stehen sollte.
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ß
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.17. set destination=C:\T
21. if %tag% == 1 usw
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ß
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 Auf den ersten Blick fält mir auf, dass in Zeile 13 ein "+" nach "12" fehlt (also 12+%del_monat%).
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!
>\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
LotPings
Peinlich wenn sich selber überführt Formel angepasst - jetzt stimmt es.
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
...eher formulieren:
Grüße
Biber
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%
)
...
:: 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.
- diese Verzeichniswexelei mit "cd"....a) überflüssig und b) befindet sich der Batch am Ende/bei Abbruch in einem anderen Verzeichnis als beim Start.
- die "Wurzelverzeichnisse" der Tages- und Monatssicherungen verwendest du mehrfach -> nimm sie in Variablen.
Grüße
Biber
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
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