Top-Themen

Aktuelle Themen (A bis Z)

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, 3048 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 ..
Ähnliche Inhalte
Windows Server
Probleme mit Backupscript
Frage von takvorianWindows Server9 Kommentare

Hallo zusammen, an einem Hypervisor (Der Hypervisor ist kein Mitglied der Domäne) mit Windows Server 2016 exportiere ich mittels ...

Batch & Shell
Backupscript soll automatisch die nächsten Unterordner finden und als Variable übergeben
gelöst Frage von ZunarasBatch & Shell7 Kommentare

Schönen guten Tag und frohe Weihnachten! Ich habe einen Foto-Ordner mit Unterordner in Jahren unterteilt. D:\Eigene Dateien\Bilder\2016 D:\Eigene Dateien\Bilder\2015 ...

Neue Wissensbeiträge
Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 StundeHumor (lol)2 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 17 StundenMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 17 StundenSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 19 StundenAdministrator.de Feedback10 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Linux
OpenSource Groupware
Frage von FA-jkaLinux13 Kommentare

Hallo, ich suche eine Groupware als Alternative zum Exchange. Wesentliche Aufgaben sind die Handhabung von E-Mails (persönliche und gemeinsam ...