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

Befehl im Batchablauf alle X-Tage wechseln

Frage Entwicklung Batch & Shell

Mitglied: McNugget

McNugget (Level 1) - Jetzt verbinden

15.06.2010 um 15:52 Uhr, 4243 Aufrufe, 19 Kommentare

Hallo allerseits.

Ich sichere jeden Tag per Batch SQL-Datenbanken und Logdateien weg.

Momentan wird täglich die .log-Datei abgeschnitten und mit dem "Durchschlag" der DB-Dateien abgelegt.

Möchte man nun aber später die Transaktionslogs wieder durchsuchen, ist es sehr lästig/schwierig/unschön, so viele Log-Datei-Fragmente zu haben.

Wie kann ich dafür sorgen, dass zeitlich festgelegt zwischen zwei verschiedenen Befehlen zur DB-Sicherung umgeschaltet wird?

Ich möchte (fast) jeden Tag nur die DB mit unverändertem.Log wegsichern.
Aber nur jeden ersten Montag jeden 1. Monat (oder jeden 2. Monat, oder jeden 3. Monat) möchte ich den anderen Befehl ausführen, der die Log-Datei abschneidet.

Ich hoffe, ich habe das einigermassen verständlich ausgedrückt.

Kann man so etwas mit Batch-Programmierung lösen?



Vielen Dank für´s Lesen und für´s Helfen

McNugget
Mitglied: bastla
15.06.2010 um 16:33 Uhr
Hallo McNugget!

Datums- bzw Wochentagsberechnungen lassen sich in VBS einfacher erledigen als in Batch - daher verwendet die folgende Skizze ein (vom Batch selbst erstelltes) VBScript:
01.
@echo off & setlocal 
02.
set "Datum=%date%" 
03.
set "Datum=07.06.2010" 
04.
 
05.
set C=%temp%\CheckForFirstMonday.vbs 
06.
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7) 
07.
 
08.
for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i" 
09.
if %ErsterMontag%==1 echo Es is wieder soweit ...
Zum Testen ist in Zeile 3 ein Datum angegeben - im "Normalbetrieb" wäre die Zeile 3 einfach zu entfernen ...
Hinsichtlich des 1., 2. oder 3. Monats sollte es ja genügen, die entsprechenden Monatszahlen festzulegen (etwa auf die Monate 01, 04, 07 und 10) und mit dem aktuellen Monat zu vergleichen - letzteres lässt sich so ermitteln:
for /f "tokens=2 delims=." %%i in ("%date%") do set "Monat=%%i"
Grüße
bastla
Bitte warten ..
Mitglied: McNugget
15.06.2010 um 17:06 Uhr
Vielen Dank bastla,


das ist schon eine super Hilfe.

Kannst Du mir auch sagen, wie ich die Bedingungen verknüpfe?


Ich müsste ja prinzipiell irgendwie sagen:

IF (Monat = (01 oder 04 oder 07 oder 10))
AND (Erster_Montag = 1)
THEN (tue das eine)
ELSE (tue das andere).

Aber Schlüsselwörter wie AND oder OR sind in der Syntax nicht vorgesehen, oder?


Ich bin echt beeindruckt, wie sehr man das ganze gescripte drauf haben kann.

Gruss

McNugget
Bitte warten ..
Mitglied: bastla
15.06.2010 um 17:19 Uhr
Hallo McNugget!

ZB so:
01.
set "DoIt=" 
02.
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True" 
03.
if defined DoIt if %Erster_Montag%==1 ( 
04.
    echo tue das eine 
05.
) else ( 
06.
    echo tue das andere 
07.
)
Grüße
bastla
Bitte warten ..
Mitglied: Biber
15.06.2010 um 17:31 Uhr
Moin mcNugget,

ich wollte es genauso angehen wie bastla, nur anders veranschaulichen.

Weil ich schon etwas vorbereitet hatte, poste ich es noch.

Meine Demo am CMD-Prompt wäre dieses.
>for %i in (01 02 03 04 05 06 07 08 09 10 11 12) do @for %j in (01 04 07 10) do @if "%i"=="%j" @Echo relevanter Monat [%i] 
relevanter Monat [01] 
relevanter Monat [04] 
relevanter Monat [07] 
relevanter Monat [10]
... und die Erklärung dazu folgende:
- in der linken FOR-Anweisung (transportiert die Laufvariable %i) spiele ich die zwölf möglichen Monatswerte durch
- und prüfe sie in der rechten FOR-Anweisung gegen die vier relevanten Monate.

In einem Batchablauf würde genau das herauskommen, was bastla skizziert hat.

Grüße
Biber
Bitte warten ..
Mitglied: LotPings
15.06.2010 um 18:44 Uhr
Hallo mcNugget, bastla Biber,

vielleicht denke ich ja zu abstrakt, aber ich würde das mit Modulus berechnen.

Hiermit lässt sich x auch einfach auswechseln
01.
Set x=3 
02.
set /A "xMonat=Monat %% x" 
03.
if %xMonat% EQU 1 Echo Jawohl,  wir haben einen %x%.ten Monat.
Auch der erste Montag,Dienstag etc lässt sich auf Basis des berechneten Wochentags des 1. ermitteln.
Hier ganz ohne VBS-Trick nur mit einer Funktion aus Ritchie Lawrence Batch function library.
01.
@Echo off&setlocal EnableDelayedExpansion 
02.
:: Datumsformat 15.06.2010 
03.
For /f "usebackq tokens=1-3 delims=-." %%A in ('%date%' 
04.
  ) do Set /A "yy=%%C,mm=1%%B-100,dd=1%%A-100" 
05.
Echo Heute Jahr:%yy% Monat:%mm% Tag:%dd% 
06.
Call :DateTodow %yy% %mm% 1 dow 
07.
set x=3 
08.
set /A "MO1=(8-dow) %% 7 +1, xMon=mm %% x" 
09.
If %xMon% EQU 1 Echo Wir haben jetzt einen einen %x%.ten Monat 
10.
Echo Erster Montag des Monats %yy%-%mm% ist der %MO1%. 
11.
If %xMon% EQU 1 If %dd% EQU %MO1% Echo Beide Bedingungen erfüllt 1.Montag %x%.ter Monat 
12.
 
13.
goto :Eof 
14.
:: Funktion aus Ritchie Lawrence Batch function Library ------------ 
15.
:DateTodow %yy% %mm% %dd% dow 
16.
:: Func: Creates a day of week number from a date, where Mo=1,Di=2 
17.
setlocal EnableExtensions 
18.
set yy=%1&set mm=%2&set dd=%3 
19.
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%) 
20.
set /a dd=100%dd%%%100,mm=100%mm%%%100 
21.
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2 
22.
set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1 
23.
endlocal & set %4=%dow% & goto :Eof
Gruß
LotPings

Edit: Bedingungen auf die Ausgangsfrage angepasst.
Bitte warten ..
Mitglied: bastla
15.06.2010 um 21:16 Uhr
Hallo LotPings!

Daran hatte ich durchaus gedacht - allerdings hätte meine Lösung (im Beispiel für einen Abstand von 4 Monaten, aber immer im Januar beginnend) eher so ausgesehen (Primzahlen sind was Feines ):
01.
@echo off & setlocal 
02.
REM set "Datum=%date%" 
03.
set "Datum=%~1" 
04.
set /a Monate=4 
05.
 
06.
set /a M1=101 %% Monate 
07.
set C=%temp%\CheckForFirstMonday.vbs 
08.
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7) 
09.
 
10.
for /f %%i in ('cscript //nologo %C% %Datum%') do for /f "tokens=2 delims=." %%m in ("%Datum%") do set /a M2=(1%%m*%%i) %% Monate 
11.
If %M1%==%M2% ( 
12.
    echo tue das eine  
13.
) else (  
14.
    echo tue das andere  
15.
)
Beim Testen wird hier das Datum als Parameter übergeben:
D:\>AmErstenMontag.cmd 03.05.2010 
tue das eine 
 
D:\>AmErstenMontag.cmd 04.05.2010 
tue das andere 
 
D:\>AmErstenMontag.cmd 10.05.2010 
tue das andere 
 
D:\>AmErstenMontag.cmd 07.06.2010 
tue das andere 
 
D:\>AmErstenMontag.cmd 05.07.2010 
tue das andere 
 
D:\>AmErstenMontag.cmd 06.09.2010 
tue das eine 
 
D:\>
Die Schleifenvariante schien mir dann aber leichter nachvollziehbar ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
15.06.2010 um 22:19 Uhr
Moin LotPings und bastla,

die Modulo-Idee ist ja durchaus okay (solange es auch für den tatsächlichen Anwender, also den Threadowner) nachvollziehbar und wartbar bleibt.

Aus genau diesem Grund würde ich aber auch den Ritchie Lawrence-Schnipsel definitiv nicht empfehlen.

Außerdem... für Anforderungen wie "am ersten Montag der Monate Januar, April und September starte XY-Programm.."... hmmm...

Damals bei Raumschiff Enterprise... oder war es Raumpatroille Orion...?

Jedenfalls wollten die so eine Art TaskPlaner erfinden... einen Computer, der automatisch nach ein paar Wochen oder Jahren alles aktiviert...

Weiss jemand, was aus dieser idee geworden ist?

Grüße
Biber
Bitte warten ..
Mitglied: bastla
15.06.2010 um 22:45 Uhr
@Biber
Weiss jemand, was aus dieser idee geworden ist?
Wurde wohl wegen des fehlenden Spaßfaktors weitgehend verdrängt ...
solange es auch für den tatsächlichen Anwender, also den Threadowner) nachvollziehbar und wartbar bleibt.
Naja, in LotPings Zeile 1 oder meiner Zeile 4 die Monatsanzahl einzutragen sollte kaum jemanden überfordern (und dass die 3 oder mehr Monate erwartbar sind, müssen wir ohnehin voraussetzen ) ...

Grüße
bastla
Bitte warten ..
Mitglied: McNugget
15.06.2010 um 22:45 Uhr
´n Abend.

Ihr seid ja der absolute Hammer. Ich habe fast ein schlechtes Gewissen, dass ich in der Zwischenzeit Fussball geschaut habe...
Vielen Dank für die freundlichen kreativen und vielfältigen Antworten.

Lange nicht mehr so eine Resonanz auf einen Thread gehabt.

Die Modulo-Idee hatte ich auch, da ich sie aus der SPS-Programmierung kenne, aber ich wusste nicht wie..
Kann mir das noch mal jemand erklären/auseiandersetzen?

Den "Ritchie Lawrence-Schnipsel" schnalle ich nicht so ganz.

Dann werde ich mal weiter an meinem Batch basteln.

Vielen vielen dank an Euch drei.


Gruss

McNugget

P. S.: Bitte nicht schlagen: Wie würdet Ihr die beiden auszuwählenden Funktionen aufrufen???
Bitte warten ..
Mitglied: bastla
15.06.2010 um 22:49 Uhr
Hallo McNugget!
Wie würdet Ihr die beiden auszuwählenden Funktionen aufrufen???
Da wir darüber ja nicht besonders viel wissen, am ehesten:
01.
call :Funktion
und weiter unten im Batch:
01.
:: Ende Hauptprogramm 
02.
goto :eof 
03.
 
04.
:Funktion 
05.
echo Hier spielt sich's ab ... 
06.
:: Ruecksprung in das Hauptprogramm 
07.
goto :eof
Die Modulo-Idee ...
Kann mir das noch mal jemand erklären/auseiandersetzen?
Siehst Du bei LotPings Beispiel etwas besser:
Da im Monat 1 begonnen wird, ist der Rest der Division sicher 1 (1 / 2 = 0, Rest 1; 1 / 3 = 0, Rest 1; ...)
Wenn ein anderer Monat überprüft wird, muss dieser Rest bei der Division durch die Anzahl der Monate ebenfalls 1 betragen, damit ein Vielfaches der Anzahl vergangen ist - am Beispiel 3:
1 / 3 = 0 Rest 1
2 / 3 = 0 Rest 2
3 / 3 = 1 Rest 0
4 / 3 = 1 Rest 1
5 / 3 = 1 Rest 2
6 / 3 = 2 Rest 0
7 / 3 = 2 Rest 1
...

Grüße
bastla
Bitte warten ..
Mitglied: LotPings
16.06.2010 um 10:00 Uhr
Zitat von Biber:
Moin LotPings und bastla,
Moin moin.
die Modulo-Idee ist ja durchaus okay (solange es auch für den tatsächlichen Anwender, also den Threadowner) nachvollziehbar und wartbar bleibt.
Da hat bastla ja schon nachgeholfen.
Aus genau diesem Grund würde ich aber auch den Ritchie Lawrence-Schnipsel definitiv nicht empfehlen.
Da ich die Black-Box "Einspritzsteuerung eines Motors" zwar nicht duchschaue, aber doch benutze, sehe ich das anders.
(Die Anzahl der Leute die deine 152 Zeilen "The Final Version 0.01 Beta -->Now Version 0.10 23.10.2008" benutzen dürfte höher sein als derer die sie durchgearbeitet und verstanden haben)
Ich kann das für mich für ALLE von Ritchies Funktionen und auch für deine Schrotungen behaupten. Aber es kann und muss ja nicht jeder alles verstehen
Außerdem... für Anforderungen wie "am ersten Montag der Monate Januar, April und September starte
XY-Programm.."... hmmm...
%< ----- nachpubertäre SF-Träume ----- >%
Weiss jemand, was aus dieser idee geworden ist?
Wer nicht in der Lage ist, funktionierende Teilaspekte zu einer Lösung zu vereinen muss tatsächlich warten bis es jemand anderes macht.
Aber ich baue es jetzt in meinem obigen Batch ein.

Gruß
LotPings
Bitte warten ..
Mitglied: McNugget
16.06.2010 um 11:38 Uhr
Hallo, ich habe es jetzt mal so zusammengesetzt.

Da gibt mir das System aber einen Syntaxfehler zurück.


01.
REM @echo off & setlocal 
02.
set "Datum=%date%" 
03.
REM set "Datum=07.06.2010" 
04.
 
05.
 
06.
set C=%temp%\CheckForFirstMonday.vbs 
07.
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7) 
08.
 
09.
for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i" 
10.
if %ErsterMontag%==1 echo Es is wieder soweit ... 
11.
 
12.
 
13.
 
14.
set "DoIt=" 
15.
 
16.
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True" 
17.
if defined DoIt if %Erster_Montag%==1 ( 
18.
    echo tue das eine 
19.
) else ( 
20.
    echo tue das andere 
21.
22.
Pause 
23.
 


Die Zeilen von gestener 21.16 von Bastla erzeugen auch einen Fehler.


Was mache ich denn noch falsch?


Ich werde gleich mal den gesamten Batchablauf einstellen. Vielleicht lässt isch daran ja etwas optimieren.

Vielen Dank auf jeden Fall für Eure untestützung.


Gruss

McNugget
Bitte warten ..
Mitglied: McNugget
16.06.2010 um 11:59 Uhr
Also hier mal meine Batchdatei mit FTP-Datei-Aufruf und .VBS Verzeichnisbereinigung.

Ich habe sämtliche Passwort und Userdaten etwas umbenannt, muss ja für mich sicher bleiben.


Die Batchdatei:
01.
:: @ECHO off 
02.
ECHO. 
03.
ECHO. 
04.
ECHO %date% ***************************************************************************************** 
05.
ECHO ************************************************************************************************ 
06.
echo %time:~0,8% 
07.
 
08.
 
09.
:set jahr=%date:~-4% 
10.
:set monat=%date:~-7,2% 
11.
:set tag=%date:~-10,2% 
12.
 
13.
:: Ermittelt Datums/Zeitvariable aus Systemdatum/Systemzeit OHNE REG-Abfragen 
14.
:: Einschränkung: Sollte schon NT oder höher sein, Deshalb die nächte Zeile 
15.
IF NOT "%OS%"=="Windows_NT" echo "%0 läuft nur unter WinNT oder höher. Sorry." && GOTO :eof 
16.
SET "AllDateTimeVars=DateOrder KW DoW DoY DD TT MM JJ YY hh min ss ms" 
17.
FOR %%i in (%AllDateTimeVars%) do @if defined %%i set %%i= 
18.
:: Datum OHNE Wochentag. Zwischenschritt mit MyDateOhneDoW 
19.
Set MyDateOhneDoW=%date% 
20.
:: Die nächste Code-Zeile ändert nur dann etwas, wenn ein Wochentag mitgeliefert wird. 
21.
:: Aus "Sa 01.10.2005" wird dann "01.10.2005" 
22.
FOR /F "tokens=2" %%i in ("%MyDateOhneDoW%") do Set MyDateOhneDoW=%%i 
23.
FOR /F "tokens=1-7 delims=:/.-, " %%i in ("%MyDateOhneDow% %time%") do ( 
24.
For /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do ( for %%@ in ("DateOrder=%%a-%%b-%%c" "%%a=%%i" "%%b=%%j" "%%c=%%k" "hh=%%l" "min=%%m" "ss=%%n" "ms=%%o") do set %%@ ) ) 
25.
 
26.
 
27.
::  ***** Zusammenbauen Zeitstempel *****  
28.
SET myDateTime=%JJ%_%MM%_%TT%_%hh%_%min% 
29.
SET myDate=%JJ%_%MM%_%TT% 
30.
SET myTime=%hh%_%min% 
31.
SET myTimeS=%hh%:%min%:%ss% 
32.
SET zippath=D:\programme\7-zip 
33.
SET kbpath=K:\mustermann\ 
34.
set mstpath=K:\mst\ 
35.
echo %time:~0,8% 
36.
 
37.
 
38.
 
39.
 
40.
::  ***** Datenbanken in Zwischenverzeichnis wegsichern *****  
41.
k: 
42.
cd.. 
43.
cd.. 
44.
cd.. 
45.
cd.. 
46.
 
47.
cd mustermann 
48.
dbbackup -r -c "filedsn=firma1.dsn;uid=admin;pwd=pword" -y J:\backup 
49.
echo %time:~0,8% 
50.
 
51.
 
52.
dbbackup -r -c "filedsn=firma4.dsn;uid=admin;pwd=pword" -y J:\backup 
53.
echo %time:~0,8% 
54.
 
55.
 
56.
cd.. 
57.
 
58.
cd mst 
59.
 
60.
dbbackup -r -c "filedsn=mst.dsn;uid=admin;pwd=pword" -y J:\backup 
61.
echo %time:~0,8% 
62.
 
63.
 
64.
 
65.
 
66.
 
67.
 
68.
::  ***** aktuellste Datei Im Proficash-Backup-Verzeichnis finden und umkopieren *****  
69.
 
70.
cd.. 
71.
cd XPC 
72.
cd 0001 
73.
 
74.
for /f "delims=" %%i in ('dir /a-d /b /od') do set Letzte_Datei=%%i 
75.
 
76.
Xcopy "%Letzte_Datei%" J:\Backup 
77.
 
78.
 
79.
 
80.
 
81.
 
82.
 
83.
  
84.
 
85.
::  ***** Datenbanken in Zwischenverzeichnis umbenennen *****  
86.
 
87.
ren J:\Backup\Firma1.db F1_Sicherung_%myDateTime%.db 
88.
ren J:\Backup\Firma1.log F1_Sicherung_%myDateTime%.log 
89.
 
90.
ren J:\Backup\Firma4.db F4_Sicherung_%myDateTime%.db 
91.
ren J:\Backup\Firma4.log F4_Sicherung_%myDateTime%.log 
92.
 
93.
ren J:\Backup\mst.db mst_Sicherung_%myDateTime%.db 
94.
ren J:\Backup\mst.log mst_Sicherung_%myDateTime%.log 
95.
 
96.
echo %time:~0,8% 
97.
 
98.
 
99.
 
100.
 
101.
 
102.
 
103.
::  ***** Datenbanken komprimieren *****  
104.
 
105.
%zippath%\7z.exe a J:\Backup\F1_Sicherung_%myDateTime%.zip J:\Backup\F1*.*  
106.
%zippath%\7z.exe a J:\Backup\F4_Sicherung_%myDateTime%.zip J:\Backup\F4*.*  
107.
%zippath%\7z.exe a J:\Backup\mst_%myDateTime%.zip J:\Backup\M*.*  
108.
%zippath%\7z.exe a J:\Backup\Proficash_%myDateTime%.zip J:\Backup\prof*.sav  
109.
 
110.
del J:\Backup\*.db 
111.
del J:\Backup\*.log 
112.
del J:\Backup\*.sav 
113.
 
114.
 
115.
echo %time:~0,8% 
116.
 
117.
 
118.
 
119.
 
120.
 
121.
 
122.
 
123.
::  ***** komprimierte Datenbanken aus Zwischenverzeichnis verteilen *****  
124.
 
125.
xcopy J:\Backup\F1*.zip J:\Backup\F1\ /F /y 
126.
xcopy J:\Backup\F4*.zip J:\Backup\F4\ /F /y 
127.
 
128.
xcopy J:\Backup\M*.zip J:\Backup\mst\ /F /y 
129.
 
130.
xcopy J:\Backup\Prof*.zip J:\Backup\Proficash\ /F /y 
131.
 
132.
 
133.
xcopy J:\Backup\F1*.zip V:\Backup\F1\ /F /y 
134.
xcopy J:\Backup\F4*.zip V:\Backup\F4\ /F /y 
135.
 
136.
xcopy J:\Backup\M*.zip V:\Backup\mst\ /F /y 
137.
 
138.
xcopy J:\Backup\Prof*.zip V:\Backup\Proficash\ /F /y 
139.
 
140.
echo %time:~0,8% 
141.
 
142.
 
143.
 
144.
 
145.
 
146.
 
147.
::  ***** Datenbanken aus Zwischenverzeichnis per FTP wegsichern und Zwischenverzeichnis leeren *****  
148.
::  ***** Achtung! Befehlssequenz liegt in der daten.ftp !! *****  
149.
 
150.
 
151.
ftp.exe -n -i -s:K:\batchdateien\DaSi\daten.ftp 
152.
 
153.
echo %time:~0,8% 
154.
 
155.
 
156.
 
157.
 
158.
 
159.
 
160.
::  ***** Zwischenverzeichnis bereinigen  *****  
161.
 
162.
J: 
163.
cd \Backup\  
164.
echo J | del *.* 
165.
 
166.
 
167.
cd... 
168.
 
169.
 
170.
echo %time:~0,8% 
171.
 
172.
 
173.
 
174.
 
175.
 
176.
 
177.
::  ***** Datensicherungen älter 30 Tagen entfernen *****  
178.
 
179.
attrib -R -A -S -H J:\Backup\F1\*.* /S /D 
180.
attrib -R -A -S -H J:\Backup\F4\*.* /S /D 
181.
 
182.
attrib -R -A -S -H J:\Backup\mst\*.* /S /D 
183.
 
184.
attrib -R -A -S -H J:\Backup\Proficash\*.* /S /D 
185.
 
186.
 
187.
k:\DaSi\backups_aelter_als_30_tage_loeschen.vbs 
188.
ECHO. 
189.
echo %Date% %time:~0,8% 
190.
ECHO ************************************************************************************************ 
191.
ECHO ************************************************************************************************ 
192.
@ECHO ON

Dann noch die aufgerufene .ftp-Datei:
01.
OPEN externserver.isageek.com        
02.
USER mustermaxe                        
03.
musterpasswort 
04.
 
05.
CD F1                                          
06.
mput j:\backup\F1*.zip 
07.
 
08.
cd .. 
09.
 
10.
CD F4                                          
11.
mput j:\backup\F4*.zip 
12.
 
13.
cd .. 
14.
 
15.
CD Mst                                          
16.
mput j:\backup\Mst.zip 
17.
 
18.
cd .. 
19.
 
20.
CD Proficash 
21.
mput j:\backup\Pro*.zip 
22.
 
23.
 
24.
cd .. 
25.
 
26.
bye
Und zu guter letzt noch die .VBS-Datei zur Bereinigung des Backupverzeichnisses:
01.
 
02.
'Definition des Verzeichnisses in dem gelöscht werden soll 
03.
Verzeichnis = "J:\Backup" 
04.
 
05.
'Definition der Anzahl der Tage 
06.
Aufheben    = 30 
07.
' Ende der Anpassungen 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
Set ordner = fso.GetFolder(Verzeichnis) 
11.
heute = Date() 
12.
DeleteInFolder(ordner) 
13.
 
14.
Sub DeleteInFolder(ordner) 
15.
  Set dateien = ordner.Files 
16.
  ' Alle Dateien in diesem Ordner abklappern 
17.
  For Each datei In dateien 
18.
    If datei.DateLastModified < (heute - Aufheben) Then 
19.
      datei.Delete 
20.
    End If 
21.
  Next 
22.
  Set untere = ordner.SubFolders 
23.
  ' Alle Unterordner abklappern, DeleteInFolder rekursiv aufrufen 
24.
  For Each unter In untere 
25.
    DeleteInFolder(unter) 
26.
  Next 
27.
End Sub 
28.
 
29.
 
30.
' wenn statt "lastmodified" ein "lastcreated" gewünscht wird, dann 
31.
' If datei.DateLastModified < (heute - Aufheben) Then 
32.
' ersetzen durch 
33.
' If datei.DateCreated < (heute - Aufheben) Then 
34.
 
Was lässt sich hieran optimieren?

Speziell die Zeilen 48, 52, 60 möchte ich eben alle drei Monate (immer eben am ersten Montag) geändert aufrufen.

Zugegeben, das habe ich mir auch eher "zusammengesammelt" aber bisher tut es seinen Dienst ganz gut.

Allerdings ist ein Riesenproblem noch, dass ich keinerlei Fehlermeldung bekomme, wenn FTP zum entfernten Rechner mal nicht funktioniert hat.




Gruss

McNugget
Bitte warten ..
Mitglied: bastla
16.06.2010 um 12:55 Uhr
Hallo McNugget!

Die Einzelteile zusammengefasst (inkl Ausgabe von "tue das andere" in allen relevanten Fällen) sähen dann etwa so aus:
01.
@echo off & setlocal 
02.
set "Datum=%date%" 
03.
REM set "Datum=05.07.2010" 
04.
 
05.
:: Überprüfung auf "erster Montag" - Ergebnis: 1 oder 0 
06.
set C=%temp%\CheckForFirstMonday.vbs 
07.
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7) 
08.
for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i" 
09.
 
10.
:: Überprüfung, ob Durchführung in diesem Monat gewünscht - Ergebnis: %DoIt% definiert oder nicht 
11.
for /f "tokens=2 delims=." %%i in ("%Datum%") do set "Monat=%%i" 
12.
set "DoIt=" 
13.
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True" 
14.
 
15.
:: Überprüfung beider Bedingungen (zuerst Monat, dann Montag) mit jeweils zugeordneter Ausgabe (Aktion): 
16.
if defined DoIt ( 
17.
    if %ErsterMontag%==1 ( 
18.
        echo tue das eine 
19.
    ) else ( 
20.
        echo tue das andere 
21.
22.
) else ( 
23.
    echo tue das andere 
24.
25.
Pause
Den Rest sehe ich mir später an ...

Grüße
bastla

P.S.: Die "Spiel-Version" von 21:16 kann nur funktionieren, wenn Du entweder die Zeile 3 entfernst und Zeile 2 verwendest, oder, so wie ich es oben gezeigt habe, beim Aufruf das zu prüfende Datum als Parameter übergibst ...
Bitte warten ..
Mitglied: McNugget
16.06.2010 um 13:35 Uhr
Vielen Dank bastla.

Ich habe es jetzt mal komplett "zusammengewurschtelt".
Könnte es so laufen?
Gibt es da noch was zu optimieren?
Theoretisch müsste es doch gehen, dass man anhand der "3-Monatsbedingung" immer nur die Aufrufzeile für das DB-Backup auswählt, oder?

Ich glaube mal, auch wenn es grundsätzlich funktioniert, dass es alles andere als elegant gelöst ist, oder?

Ach ja, falls es verwundert, dass überall "echo %time:~0,8%" kommt:
ich rufe diesen Batch aus einer weiteren Batch-Datei auf und lasse die entstehenden Meldungen direkt in eine log-Textdatei ausgeben.




01.
@echo off & setlocal  
02.
ECHO. 
03.
ECHO. 
04.
ECHO %date% ***************************************************************************************** 
05.
ECHO ************************************************************************************************ 
06.
echo %time:~0,8% 
07.
 
08.
 
09.
:set jahr=%date:~-4% 
10.
:set monat=%date:~-7,2% 
11.
:set tag=%date:~-10,2% 
12.
 
13.
:: Ermittelt Datums/Zeitvariable aus Systemdatum/Systemzeit OHNE REG-Abfragen 
14.
:: Einschränkung: Sollte schon NT oder höher sein, Deshalb die nächte Zeile 
15.
IF NOT "%OS%"=="Windows_NT" echo "%0 läuft nur unter WinNT oder höher. Sorry." && GOTO :eof 
16.
SET "AllDateTimeVars=DateOrder KW DoW DoY DD TT MM JJ YY hh min ss ms" 
17.
FOR %%i in (%AllDateTimeVars%) do @if defined %%i set %%i= 
18.
:: Datum OHNE Wochentag. Zwischenschritt mit MyDateOhneDoW 
19.
Set MyDateOhneDoW=%date% 
20.
:: Die nächste Code-Zeile ändert nur dann etwas, wenn ein Wochentag mitgeliefert wird. 
21.
:: Aus "Sa 01.10.2005" wird dann "01.10.2005" 
22.
FOR /F "tokens=2" %%i in ("%MyDateOhneDoW%") do Set MyDateOhneDoW=%%i 
23.
FOR /F "tokens=1-7 delims=:/.-, " %%i in ("%MyDateOhneDow% %time%") do ( 
24.
For /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do ( for %%@ in ("DateOrder=%%a-%%b-%%c" "%%a=%%i" "%%b=%%j" "%%c=%%k" "hh=%%l" "min=%%m" "ss=%%n" "ms=%%o") do set %%@ ) ) 
25.
 
26.
 
27.
::  ***** Zusammenbauen Zeitstempel *****  
28.
SET myDateTime=%JJ%_%MM%_%TT%_%hh%_%min% 
29.
SET myDate=%JJ%_%MM%_%TT% 
30.
SET myTime=%hh%_%min% 
31.
SET myTimeS=%hh%:%min%:%ss% 
32.
SET zippath=D:\programme\7-zip 
33.
SET kbpath=K:\mustermann\ 
34.
set mstpath=K:\mst\ 
35.
echo %time:~0,8% 
36.
 
37.
 
38.
 
39.
set "Datum=%date%" 
40.
REM set "Datum=05.07.2010" 
41.
 
42.
:: Überprüfung auf "erster Montag" - Ergebnis: 1 oder 0 
43.
set C=%temp%\CheckForFirstMonday.vbs 
44.
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7) 
45.
for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i" 
46.
 
47.
:: Überprüfung, ob Durchführung in diesem Monat gewünscht - Ergebnis: %DoIt% definiert oder nicht 
48.
for /f "tokens=2 delims=." %%i in ("%Datum%") do set "Monat=%%i" 
49.
set "DoIt=" 
50.
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True" 
51.
 
52.
:: Überprüfung beider Bedingungen (zuerst Monat, dann Montag) mit jeweils zugeordneter Ausgabe (Aktion): 
53.
if defined DoIt ( 
54.
    if %ErsterMontag%==1 ( 
55.
		echo normales Backup  
56.
		echo %time:~0,8% 
57.
        call :normales_Backup 
58.
    ) else ( 
59.
        echo Backup mit Logverkleinerung  
60.
		echo %time:~0,8% 
61.
		call :Backup_mit_Logverkleinerung 
62.
63.
) else ( 
64.
    echo tue das andere 
65.
66.
 
67.
 
68.
:Backup_mit_Logverkleinerung 
69.
REM ************************************************ 
70.
REM ************************************************ 
71.
REM Hier wird nur alle paar Monate reingesprungen und das Transaktionslog abgeschnitten. 
72.
REM ************************************************ 
73.
REM ************************************************ 
74.
 
75.
 
76.
 
77.
 
78.
::  ***** Datenbanken in Zwischenverzeichnis wegsichern *****  
79.
k: 
80.
cd.. 
81.
cd.. 
82.
cd.. 
83.
cd.. 
84.
 
85.
cd mustermann 
86.
dbbackup -r -c "filedsn=firma1.dsn;uid=admin;pwd=pword" -y J:\backup 
87.
echo %time:~0,8% 
88.
 
89.
 
90.
dbbackup -r -c "filedsn=firma4.dsn;uid=admin;pwd=pword" -y J:\backup 
91.
echo %time:~0,8% 
92.
 
93.
 
94.
cd.. 
95.
 
96.
cd mst 
97.
 
98.
dbbackup -r -c "filedsn=mst.dsn;uid=admin;pwd=pword" -y J:\backup 
99.
echo %time:~0,8% 
100.
 
101.
goto :Abschluss 
102.
 
103.
 
104.
:normales_Backup 
105.
REM ************************************************ 
106.
REM ************************************************ 
107.
REM Hier wird standardmaessig reingesprungen. 
108.
REM ************************************************ 
109.
REM ************************************************ 
110.
 
111.
::  ***** Datenbanken in Zwischenverzeichnis wegsichern *****  
112.
k: 
113.
cd.. 
114.
cd.. 
115.
cd.. 
116.
cd.. 
117.
 
118.
cd mustermann 
119.
dbbackup -c "filedsn=firma1.dsn;uid=admin;pwd=pword" -y J:\backup 
120.
echo %time:~0,8% 
121.
 
122.
 
123.
dbbackup -c "filedsn=firma4.dsn;uid=admin;pwd=pword" -y J:\backup 
124.
echo %time:~0,8% 
125.
 
126.
 
127.
cd.. 
128.
 
129.
cd mst 
130.
 
131.
dbbackup -c "filedsn=mst.dsn;uid=admin;pwd=pword" -y J:\backup 
132.
echo %time:~0,8% 
133.
 
134.
 
135.
goto :Abschluss 
136.
 
137.
 
138.
 
139.
 
140.
 
141.
 
142.
 
143.
 
144.
:Abschluss 
145.
 
146.
REM ************************************************ 
147.
REM ************************************************ 
148.
REM die Programzeilen ab hier müssen IMMEr abgearbeitet werden. 
149.
REM ************************************************ 
150.
REM ************ 
151.
 
152.
 
153.
 
154.
::  ***** aktuellste Datei Im Proficash-Backup-Verzeichnis finden und umkopieren *****  
155.
 
156.
cd.. 
157.
cd XPC 
158.
cd 0001 
159.
 
160.
for /f "delims=" %%i in ('dir /a-d /b /od') do set Letzte_Datei=%%i 
161.
 
162.
Xcopy "%Letzte_Datei%" J:\Backup 
163.
 
164.
 
165.
 
166.
 
167.
 
168.
 
169.
  
170.
 
171.
::  ***** Datenbanken in Zwischenverzeichnis umbenennen *****  
172.
 
173.
ren J:\Backup\Firma1.db F1_Sicherung_%myDateTime%.db 
174.
ren J:\Backup\Firma1.log F1_Sicherung_%myDateTime%.log 
175.
 
176.
ren J:\Backup\Firma4.db F4_Sicherung_%myDateTime%.db 
177.
ren J:\Backup\Firma4.log F4_Sicherung_%myDateTime%.log 
178.
 
179.
ren J:\Backup\mst.db mst_Sicherung_%myDateTime%.db 
180.
ren J:\Backup\mst.log mst_Sicherung_%myDateTime%.log 
181.
 
182.
echo %time:~0,8% 
183.
 
184.
 
185.
 
186.
 
187.
 
188.
 
189.
::  ***** Datenbanken komprimieren *****  
190.
 
191.
%zippath%\7z.exe a J:\Backup\F1_Sicherung_%myDateTime%.zip J:\Backup\F1*.*  
192.
%zippath%\7z.exe a J:\Backup\F4_Sicherung_%myDateTime%.zip J:\Backup\F4*.*  
193.
%zippath%\7z.exe a J:\Backup\mst_%myDateTime%.zip J:\Backup\M*.*  
194.
%zippath%\7z.exe a J:\Backup\Proficash_%myDateTime%.zip J:\Backup\prof*.sav  
195.
 
196.
del J:\Backup\*.db 
197.
del J:\Backup\*.log 
198.
del J:\Backup\*.sav 
199.
 
200.
 
201.
echo %time:~0,8% 
202.
 
203.
 
204.
 
205.
 
206.
 
207.
 
208.
 
209.
::  ***** komprimierte Datenbanken aus Zwischenverzeichnis verteilen *****  
210.
 
211.
xcopy J:\Backup\F1*.zip J:\Backup\F1\ /F /y 
212.
xcopy J:\Backup\F4*.zip J:\Backup\F4\ /F /y 
213.
 
214.
xcopy J:\Backup\M*.zip J:\Backup\mst\ /F /y 
215.
 
216.
xcopy J:\Backup\Prof*.zip J:\Backup\Proficash\ /F /y 
217.
 
218.
 
219.
xcopy J:\Backup\F1*.zip V:\Backup\F1\ /F /y 
220.
xcopy J:\Backup\F4*.zip V:\Backup\F4\ /F /y 
221.
 
222.
xcopy J:\Backup\M*.zip V:\Backup\mst\ /F /y 
223.
 
224.
xcopy J:\Backup\Prof*.zip V:\Backup\Proficash\ /F /y 
225.
 
226.
echo %time:~0,8% 
227.
 
228.
 
229.
 
230.
 
231.
 
232.
 
233.
::  ***** Datenbanken aus Zwischenverzeichnis per FTP wegsichern und Zwischenverzeichnis leeren *****  
234.
::  ***** Achtung! Befehlssequenz liegt in der daten.ftp !! *****  
235.
 
236.
 
237.
ftp.exe -n -i -s:K:\batchdateien\DaSi\daten.ftp 
238.
 
239.
echo %time:~0,8% 
240.
 
241.
 
242.
 
243.
 
244.
 
245.
 
246.
::  ***** Zwischenverzeichnis bereinigen  *****  
247.
 
248.
J: 
249.
cd \Backup\  
250.
echo J | del *.* 
251.
 
252.
 
253.
cd... 
254.
 
255.
 
256.
echo %time:~0,8% 
257.
 
258.
 
259.
 
260.
 
261.
 
262.
 
263.
::  ***** Datensicherungen älter 30 Tagen entfernen *****  
264.
 
265.
attrib -R -A -S -H J:\Backup\F1\*.* /S /D 
266.
attrib -R -A -S -H J:\Backup\F4\*.* /S /D 
267.
 
268.
attrib -R -A -S -H J:\Backup\mst\*.* /S /D 
269.
 
270.
attrib -R -A -S -H J:\Backup\Proficash\*.* /S /D 
271.
 
272.
 
273.
k:\DaSi\backups_aelter_als_30_tage_loeschen.vbs 
274.
ECHO. 
275.
echo %Date% %time:~0,8% 
276.
ECHO ************************************************************************************************ 
277.
ECHO ************************************************************************************************ 
278.
@ECHO ON 
279.
 


Gruss

McNugget
Bitte warten ..
Mitglied: bastla
17.06.2010 um 07:45 Uhr
Hallo McNugget!

Wenn Du nicht vor der Zeile 68 ein
goto :eof
einbaust, wird immer die "Logverkleinerungsvariante" zusätzlich ausgeführt - allerdings würde ich den gesamten Block (die Zeilen 53 bis 68) auf
01.
if defined DoIt if %ErsterMontag%==1 ( 
02.
        echo normales Backup  
03.
        echo %time:~0,8% 
04.
        goto :normales_Backup 
05.
06.
echo Backup mit Logverkleinerung  
07.
echo %time:~0,8%
reduzieren ...

Grüße
bastla

P.S.: Die ganze "cd .."-Parade mutet etwas seltsam an - ein
cd ..\..\..\..\mustermann
(oder gleich die Angabe eines absoluten Pfades - am Anfang des Batches und damit übersichtlich per Variablenzuweisung festgelegt) würde ich hier eher verwenden ...
Bitte warten ..
Mitglied: McNugget
17.06.2010 um 08:33 Uhr
Hallo bastla.

Danke für´s Anschauen und den Tipp mit dem zusammengeführten CD-Befehl und für den vereinfachten Aufruf der Bedingung.

Was macht ein :eof?
Damit springe ich doch an des Ende der Batchdatei, oder?

Dann wird der Programmteil :Abschluss doch nicht mehr abgearbeitet, oder sehe ich das falsch?


Wie könnte ich überprüfen, ob FTP funktioniert hat, oder mit Fehler abgerochen ist?


Gruss

McNugget



P.S.: Bin ab Morgen auf Festival, daher ist ab da bis Dienstag nicht mehr mit Reaktion von mir zu rechnen. Ich leses aber alles aufmerksam mit/nach...
Bitte warten ..
Mitglied: bastla
17.06.2010 um 09:24 Uhr
Hallo McNugget!
Was macht ein :eof?
Damit springe ich doch an des Ende der Batchdatei, oder?
Jein; es wird damit der Batch zwar beendet, aber ein mit "call" aufgerufenes Unterprogramm wird wie ein neuer Batch (der nur eben in der selben Datei gespeichert ist) behandelt - in diesem Fall entspricht das "goto :eof" einem "Return" im Ur-Basic oder einem "End Sub", bewirkt also den Rücksprung ins Hauptprogramm ...

... allerdings würde ich das in der konkreten Situation hier ohnehin so wie oben beschrieben lösen (also einfach im Ausnahmefall zur entsprechenden Stelle springen und ansonsten einfach im Programmablauf weiter machen).
Wie könnte ich überprüfen, ob FTP funktioniert hat, oder mit Fehler abgerochen ist?
Die sicherste Variante wäre natürlich, eine Checksumme (zB MD5) der Daten zu erstellen, die hochgeladenen Daten wieder herunterzuladen und die Checksumme dieser Versionen zu überprüfen ...

Grüße
bastla
Bitte warten ..
Mitglied: McNugget
17.06.2010 um 10:41 Uhr
Ahhh,
Danke für die Info.
Das wusste ich so noch nicht.

Ich habe jetzt die Logik gedreht, (da sonst wieder jeden tag die Transaktionslogs abgeschnitten ürden, und das sollen sie ja nur alle paar Monate) und nun scheint es sauber zu laufen.

Das erneute Runterladen der Dateien dauert zu lange (der normale Ablauf dauert schon ne gute halbe Stunde).

Es muss ja nicht perfekt sein, aber ich würde gerne feststellen könenn, ob die Verbindung stand, oder ob mit einem Timeout abgebrochen wurde.
Ich hatte bei dem FTP-Aufruf mehrere Tage in Folge die Meldung "nicht verbunden".

So was würde ich gerne erfahren wollen.


Gruss

McNugget



P.S.: Ist echt sehr geil, was man alles mit "simplen" Batchdateien abarbeiten kann.
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Microsoft Office
Button für Wechseln zwischen den Tabellenblättern (6)

Frage von lupi1989 zum Thema Microsoft Office ...

Linux
Chemnitzer Linux-Tage 2017 suchen nach Beiträgen

Link von runasservice zum Thema Linux ...

Batch & Shell
14 Tage alte Dateien automatisch löschen - Shell (1)

Frage von traller zum Thema Batch & Shell ...

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

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...