Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Funktionsprüfung für Backupscript

Frage Entwicklung Batch & Shell

Mitglied: Seperion

Seperion (Level 1) - Jetzt verbinden

14.07.2010, aktualisiert 13:10 Uhr, 3022 Aufrufe, 11 Kommentare

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.

01.
REM Splitten des Datums in Jahr, Monat und Tag Variablen 
02.
set jahr=%date:~-4% 
03.
set monat=%date:~-7,2% 
04.
set tag=%date:~-10,2% 
05.
 
06.
REM Neu zusammenfügen des Datums zu yyyymmdd 
07.
set datum=%jahr%%monat%%tag% 
08.
 
09.
REM Variable zum Löschen der vor 4 Monaten angelegten Sicherungen 
10.
set /a del_monat=%monat%-4 
11.
 
12.
REM Fehlerabfangen bei del_Monat < 1 
13.
if %del_monat% LSS 1 set /a del_monat=12%del_monat% 
14.
 
15.
REM Quelle und Ziel des Backups festlegen 
16.
set source=C:\Daten\ 
17.
set destination=C:\Tagessicherungen\%monat%\%datum%_Tagesbackup\ 
18.
 
19.
REM Folgender Block ist für die Monatssicherung (Pfad soll später variieren) 
20.
REM Ziel festlegen und alte Sicherungen löschen 
21.
if %tag% == 1 set destination=C:\Monatssicherungen\%monat%\ 
22.
if %tag% == 1 cd C:\Monatssicherungen\ 
23.
if %tag% == 1 rd /S /Q %del_monat% 
24.
if %tag% == 1 cd C:\Tagessicherungen\ 
25.
if %tag% == 1 rd /S /Q %del_monat% 
26.
 
27.
REM Der eigentliche "Backupprozess" :-D 
28.
mkdir %destination% 
29.
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]
Mitglied: Biber
14.07.2010 um 13:27 Uhr
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
Bitte warten ..
Mitglied: LotPings
14.07.2010 um 14:01 Uhr
Hallo Biber,

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.
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.
Bitte warten ..
Mitglied: Biber
14.07.2010 um 14:51 Uhr
Moin LotPings,

Zitat von LotPings:
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
Nein, natürlich nicht 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 ?
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
Bitte warten ..
Mitglied: Seperion
14.07.2010 um 15:55 Uhr
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.
Bitte warten ..
Mitglied: mathe172
14.07.2010 um 16:09 Uhr
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:
01.
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
01.
for /f "tokens=1-3 delims=." %%I in ('echo.%date%') do ( 
02.
set datum=%%I%%J%%K 
03.
set monat=%%J 
04.
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
Bitte warten ..
Mitglied: 60730
14.07.2010 um 16:14 Uhr
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.

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

01.
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ß
Bitte warten ..
Mitglied: LotPings
14.07.2010 um 16:22 Uhr
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

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:
01.
@Echo off&Setlocal EnableDelayedExpansion 
02.
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 Formel angepasst - jetzt stimmt es.
Bitte warten ..
Mitglied: Seperion
15.07.2010 um 16:43 Uhr
01.
set jahr=%date:~-4%  
02.
set monat=%date:~-7,2%  
03.
set tag=%date:~-10,2%  
04.
set datum=%jahr%%monat%%tag%  
05.
set /a monat=%monat% 
06.
 
07.
set /a del_monatssicherung=%monat%-6 
08.
if %del_monatssicherung% LSS 1 set /a del_monatssicherung=12+%del_monatssicherung%  
09.
 
10.
set /a del_tagessicherung=%monat%-2 
11.
if %del_tagessicherung% LSS 1 set /a del_tagessicherung=12+%del_tagessicherung% 
12.
 
13.
set source=C:\Daten\  
14.
set destination=C:\Tagessicherungen\%monat%\%datum%_Tagesbackup\  
15.
 
16.
if %tag% == 01 ( 
17.
	set destination=C:\Monatssicherungen\%monat%\  
18.
	cd C:\Monatssicherungen\  
19.
	rd /S /Q %del_monatssicherung%  
20.
	cd C:\Tagessicherungen\  
21.
	rd /S /Q %del_tagessicherung%  
22.
23.
 
24.
if not exist %destination% mkdir %destination%  
25.
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.

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
Bitte warten ..
Mitglied: Biber
15.07.2010 um 18:39 Uhr
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
Bitte warten ..
Mitglied: Seperion
24.07.2010 um 13:00 Uhr
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.

01.
set jahr=%date:~-4%  
02.
set monat=%date:~-7,2%  
03.
set tag=%date:~-10,2%  
04.
set datum=%jahr%%monat%%tag%  
05.
set /a monat=%monat% 
06.
 
07.
set "RootMonSicherung=C:\Monatssicherung" 
08.
set "RootTagSicherung=C:\Tagessicherung" 
09.
 
10.
set /a del_monatssicherung=%monat%-6 
11.
if %del_monatssicherung% LSS 1 set /a del_monatssicherung=12+%del_monatssicherung%  
12.
 
13.
set /a del_tagessicherung=%monat%-2 
14.
if %del_tagessicherung% LSS 1 set /a del_tagessicherung=12+%del_tagessicherung% 
15.
 
16.
set source=C:\Daten\  
17.
set destination=%RootTagSicherung%\%monat%\%datum%_Tagesbackup\  
18.
 
19.
if "%tag%" == "01" ( 
20.
	set destination=%RootMonSicherung%\%monat%\   
21.
	rd /S /Q "%RootMonSicherung%\%del_monatssicherung%" 
22.
	rd /S /Q "%RootTagSicherung%\%del_tagessicherung%" 
23.
24.
 
25.
if not exist %destination% mkdir %destination%  
26.
xcopy "%source%*" "%destination%" /e /v /c /i /g /h /r /y >> %destination%%datum%_Backup.log
Grüße Seperion
Bitte warten ..
Mitglied: Biber
24.07.2010 um 13:45 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...