mcnugget
Goto Top

Befehl im Batchablauf alle X-Tage wechseln

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

Content-ID: 144895

Url: https://administrator.de/forum/befehl-im-batchablauf-alle-x-tage-wechseln-144895.html

Ausgedruckt am: 23.12.2024 um 18:12 Uhr

bastla
bastla 15.06.2010 um 16:33:34 Uhr
Goto Top
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:
@echo off & setlocal
set "Datum=%date%"  
set "Datum=07.06.2010"  

set C=%temp%\CheckForFirstMonday.vbs
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7)

for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i"  
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
McNugget
McNugget 15.06.2010 um 17:06:55 Uhr
Goto Top
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
bastla
bastla 15.06.2010 um 17:19:59 Uhr
Goto Top
Hallo McNugget!

ZB so:
set "DoIt="  
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True"  
if defined DoIt if %Erster_Montag%==1 (
    echo tue das eine
) else (
    echo tue das andere
)
Grüße
bastla
Biber
Biber 15.06.2010 um 17:31:47 Uhr
Goto Top
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
77559
77559 15.06.2010 um 18:44:18 Uhr
Goto Top
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
Set x=3
set /A "xMonat=Monat %% x"  
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.
@Echo off&setlocal EnableDelayedExpansion
:: Datumsformat 15.06.2010
For /f "usebackq tokens=1-3 delims=-." %%A in ('%date%'  
  ) do Set /A "yy=%%C,mm=1%%B-100,dd=1%%A-100"  
Echo Heute Jahr:%yy% Monat:%mm% Tag:%dd%
Call :DateTodow %yy% %mm% 1 dow
set x=3
set /A "MO1=(8-dow) %% 7 +1, xMon=mm %% x"  
If %xMon% EQU 1 Echo Wir haben jetzt einen einen %x%.ten Monat
Echo Erster Montag des Monats %yy%-%mm% ist der %MO1%.
If %xMon% EQU 1 If %dd% EQU %MO1% Echo Beide Bedingungen erfüllt 1.Montag %x%.ter Monat

goto :Eof
:: Funktion aus Ritchie Lawrence Batch function Library ------------
:DateTodow %yy% %mm% %dd% dow
:: Func: Creates a day of week number from a date, where Mo=1,Di=2
setlocal EnableExtensions
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2
set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1
endlocal & set %4=%dow% & goto :Eof

Gruß
LotPings

Edit: Bedingungen auf die Ausgangsfrage angepasst.
bastla
bastla 15.06.2010 um 21:16:23 Uhr
Goto Top
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 face-wink):
@echo off & setlocal
REM set "Datum=%date%"  
set "Datum=%~1"  
set /a Monate=4

set /a M1=101 %% Monate
set C=%temp%\CheckForFirstMonday.vbs
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7)

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  
If %M1%==%M2% (
    echo tue das eine 
) else ( 
    echo tue das andere 
)
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 ... face-wink

Grüße
bastla
Biber
Biber 15.06.2010 um 22:19:40 Uhr
Goto Top
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
bastla
bastla 15.06.2010 um 22:45:33 Uhr
Goto Top
@Biber
Weiss jemand, was aus dieser idee geworden ist?
Wurde wohl wegen des fehlenden Spaßfaktors weitgehend verdrängt ... face-wink
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 face-wink) ...

Grüße
bastla
McNugget
McNugget 15.06.2010 um 22:45:59 Uhr
Goto Top
´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???
bastla
bastla 15.06.2010 um 22:49:46 Uhr
Goto Top
Hallo McNugget!
Wie würdet Ihr die beiden auszuwählenden Funktionen aufrufen???
Da wir darüber ja nicht besonders viel wissen, am ehesten:
call :Funktion
und weiter unten im Batch:
:: Ende Hauptprogramm
goto :eof

:Funktion
echo Hier spielt sich's ab ...  
:: Ruecksprung in das Hauptprogramm
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
77559
77559 16.06.2010 um 10:00:26 Uhr
Goto Top
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 face-wink
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
McNugget
McNugget 16.06.2010 um 11:38:51 Uhr
Goto Top
Hallo, ich habe es jetzt mal so zusammengesetzt.

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


REM @echo off & setlocal
set "Datum=%date%"  
REM set "Datum=07.06.2010"  


set C=%temp%\CheckForFirstMonday.vbs
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7)

for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i"  
if %ErsterMontag%==1 echo Es is wieder soweit ...



set "DoIt="  

for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True"  
if defined DoIt if %Erster_Montag%==1 (
    echo tue das eine
) else (
    echo tue das andere
)
Pause



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
McNugget
McNugget 16.06.2010 um 11:59:20 Uhr
Goto Top
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. face-wink


Die Batchdatei:
:: @ECHO off
ECHO.
ECHO.
ECHO %date% *****************************************************************************************
ECHO ************************************************************************************************
echo %time:~0,8%


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

:: Ermittelt Datums/Zeitvariable aus Systemdatum/Systemzeit OHNE REG-Abfragen
:: Einschränkung: Sollte schon NT oder höher sein, Deshalb die nächte Zeile
IF NOT "%OS%"=="Windows_NT" echo "%0 läuft nur unter WinNT oder höher. Sorry." && GOTO :eof  
SET "AllDateTimeVars=DateOrder KW DoW DoY DD TT MM JJ YY hh min ss ms"  
FOR %%i in (%AllDateTimeVars%) do @if defined %%i set %%i=
:: Datum OHNE Wochentag. Zwischenschritt mit MyDateOhneDoW
Set MyDateOhneDoW=%date%
:: Die nächste Code-Zeile ändert nur dann etwas, wenn ein Wochentag mitgeliefert wird.
:: Aus "Sa 01.10.2005" wird dann "01.10.2005" 
FOR /F "tokens=2" %%i in ("%MyDateOhneDoW%") do Set MyDateOhneDoW=%%i  
FOR /F "tokens=1-7 delims=:/.-, " %%i in ("%MyDateOhneDow% %time%") do (  
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 %%@ ) )  


::  ***** Zusammenbauen Zeitstempel ***** 
SET myDateTime=%JJ%_%MM%_%TT%_%hh%_%min%
SET myDate=%JJ%_%MM%_%TT%
SET myTime=%hh%_%min%
SET myTimeS=%hh%:%min%:%ss%
SET zippath=D:\programme\7-zip
SET kbpath=K:\mustermann\
set mstpath=K:\mst\
echo %time:~0,8%




::  ***** Datenbanken in Zwischenverzeichnis wegsichern ***** 
k:
cd..
cd..
cd..
cd..

cd mustermann
dbbackup -r -c "filedsn=firma1.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


dbbackup -r -c "filedsn=firma4.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


cd..

cd mst

dbbackup -r -c "filedsn=mst.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%






::  ***** aktuellste Datei Im Proficash-Backup-Verzeichnis finden und umkopieren ***** 

cd..
cd XPC
cd 0001

for /f "delims=" %%i in ('dir /a-d /b /od') do set Letzte_Datei=%%i  

Xcopy "%Letzte_Datei%" J:\Backup  






 

::  ***** Datenbanken in Zwischenverzeichnis umbenennen ***** 

ren J:\Backup\Firma1.db F1_Sicherung_%myDateTime%.db
ren J:\Backup\Firma1.log F1_Sicherung_%myDateTime%.log

ren J:\Backup\Firma4.db F4_Sicherung_%myDateTime%.db
ren J:\Backup\Firma4.log F4_Sicherung_%myDateTime%.log

ren J:\Backup\mst.db mst_Sicherung_%myDateTime%.db
ren J:\Backup\mst.log mst_Sicherung_%myDateTime%.log

echo %time:~0,8%






::  ***** Datenbanken komprimieren ***** 

%zippath%\7z.exe a J:\Backup\F1_Sicherung_%myDateTime%.zip J:\Backup\F1*.* 
%zippath%\7z.exe a J:\Backup\F4_Sicherung_%myDateTime%.zip J:\Backup\F4*.* 
%zippath%\7z.exe a J:\Backup\mst_%myDateTime%.zip J:\Backup\M*.* 
%zippath%\7z.exe a J:\Backup\Proficash_%myDateTime%.zip J:\Backup\prof*.sav 

del J:\Backup\*.db
del J:\Backup\*.log
del J:\Backup\*.sav


echo %time:~0,8%







::  ***** komprimierte Datenbanken aus Zwischenverzeichnis verteilen ***** 

xcopy J:\Backup\F1*.zip J:\Backup\F1\ /F /y
xcopy J:\Backup\F4*.zip J:\Backup\F4\ /F /y

xcopy J:\Backup\M*.zip J:\Backup\mst\ /F /y

xcopy J:\Backup\Prof*.zip J:\Backup\Proficash\ /F /y


xcopy J:\Backup\F1*.zip V:\Backup\F1\ /F /y
xcopy J:\Backup\F4*.zip V:\Backup\F4\ /F /y

xcopy J:\Backup\M*.zip V:\Backup\mst\ /F /y

xcopy J:\Backup\Prof*.zip V:\Backup\Proficash\ /F /y

echo %time:~0,8%






::  ***** Datenbanken aus Zwischenverzeichnis per FTP wegsichern und Zwischenverzeichnis leeren ***** 
::  ***** Achtung! Befehlssequenz liegt in der daten.ftp !! ***** 


ftp.exe -n -i -s:K:\batchdateien\DaSi\daten.ftp

echo %time:~0,8%






::  ***** Zwischenverzeichnis bereinigen  ***** 

J:
cd \Backup\ 
echo J | del *.*


cd...


echo %time:~0,8%






::  ***** Datensicherungen älter 30 Tagen entfernen ***** 

attrib -R -A -S -H J:\Backup\F1\*.* /S /D
attrib -R -A -S -H J:\Backup\F4\*.* /S /D

attrib -R -A -S -H J:\Backup\mst\*.* /S /D

attrib -R -A -S -H J:\Backup\Proficash\*.* /S /D


k:\DaSi\backups_aelter_als_30_tage_loeschen.vbs
ECHO.
echo %Date% %time:~0,8%
ECHO ************************************************************************************************
ECHO ************************************************************************************************
@ECHO ON


Dann noch die aufgerufene .ftp-Datei:
OPEN externserver.isageek.com       
USER mustermaxe                       
musterpasswort

CD F1                                         
mput j:\backup\F1*.zip

cd ..

CD F4                                         
mput j:\backup\F4*.zip

cd ..

CD Mst                                         
mput j:\backup\Mst.zip

cd ..

CD Proficash
mput j:\backup\Pro*.zip


cd ..

bye

Und zu guter letzt noch die .VBS-Datei zur Bereinigung des Backupverzeichnisses:
'Definition des Verzeichnisses in dem gelöscht werden soll  
Verzeichnis = "J:\Backup"  

'Definition der Anzahl der Tage  
Aufheben    = 30
' Ende der Anpassungen  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set ordner = fso.GetFolder(Verzeichnis)
heute = Date()
DeleteInFolder(ordner)

Sub DeleteInFolder(ordner)
  Set dateien = ordner.Files
  ' Alle Dateien in diesem Ordner abklappern  
  For Each datei In dateien
    If datei.DateLastModified < (heute - Aufheben) Then
      datei.Delete
    End If
  Next
  Set untere = ordner.SubFolders
  ' Alle Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
  For Each unter In untere
    DeleteInFolder(unter)
  Next
End Sub


' wenn statt "lastmodified" ein "lastcreated" gewünscht wird, dann  
' If datei.DateLastModified < (heute - Aufheben) Then  
' ersetzen durch  
' If datei.DateCreated < (heute - Aufheben) Then  

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
bastla
bastla 16.06.2010 um 12:55:18 Uhr
Goto Top
Hallo McNugget!

Die Einzelteile zusammengefasst (inkl Ausgabe von "tue das andere" in allen relevanten Fällen) sähen dann etwa so aus:
@echo off & setlocal
set "Datum=%date%"  
REM set "Datum=05.07.2010"  

:: Überprüfung auf "erster Montag" - Ergebnis: 1 oder 0 
set C=%temp%\CheckForFirstMonday.vbs
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7)
for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i"  

:: Überprüfung, ob Durchführung in diesem Monat gewünscht - Ergebnis: %DoIt% definiert oder nicht
for /f "tokens=2 delims=." %%i in ("%Datum%") do set "Monat=%%i"  
set "DoIt="  
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True"  

:: Überprüfung beider Bedingungen (zuerst Monat, dann Montag) mit jeweils zugeordneter Ausgabe (Aktion):
if defined DoIt (
    if %ErsterMontag%==1 (
        echo tue das eine
    ) else (
        echo tue das andere
    )
) else (
    echo tue das andere
)
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 ...
McNugget
McNugget 16.06.2010 um 13:35:36 Uhr
Goto Top
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.


@echo off & setlocal 
ECHO.
ECHO.
ECHO %date% *****************************************************************************************
ECHO ************************************************************************************************
echo %time:~0,8%


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

:: Ermittelt Datums/Zeitvariable aus Systemdatum/Systemzeit OHNE REG-Abfragen
:: Einschränkung: Sollte schon NT oder höher sein, Deshalb die nächte Zeile
IF NOT "%OS%"=="Windows_NT" echo "%0 läuft nur unter WinNT oder höher. Sorry." && GOTO :eof  
SET "AllDateTimeVars=DateOrder KW DoW DoY DD TT MM JJ YY hh min ss ms"  
FOR %%i in (%AllDateTimeVars%) do @if defined %%i set %%i=
:: Datum OHNE Wochentag. Zwischenschritt mit MyDateOhneDoW
Set MyDateOhneDoW=%date%
:: Die nächste Code-Zeile ändert nur dann etwas, wenn ein Wochentag mitgeliefert wird.
:: Aus "Sa 01.10.2005" wird dann "01.10.2005" 
FOR /F "tokens=2" %%i in ("%MyDateOhneDoW%") do Set MyDateOhneDoW=%%i  
FOR /F "tokens=1-7 delims=:/.-, " %%i in ("%MyDateOhneDow% %time%") do (  
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 %%@ ) )  


::  ***** Zusammenbauen Zeitstempel ***** 
SET myDateTime=%JJ%_%MM%_%TT%_%hh%_%min%
SET myDate=%JJ%_%MM%_%TT%
SET myTime=%hh%_%min%
SET myTimeS=%hh%:%min%:%ss%
SET zippath=D:\programme\7-zip
SET kbpath=K:\mustermann\
set mstpath=K:\mst\
echo %time:~0,8%



set "Datum=%date%"  
REM set "Datum=05.07.2010"  

:: Überprüfung auf "erster Montag" - Ergebnis: 1 oder 0 
set C=%temp%\CheckForFirstMonday.vbs
>%C% echo D=WScript.Arguments(0):WScript.Echo (Weekday(D)=vbMonday)*(Day(D)^<=7)
for /f %%i in ('cscript //nologo %C% %Datum%') do set "ErsterMontag=%%i"  

:: Überprüfung, ob Durchführung in diesem Monat gewünscht - Ergebnis: %DoIt% definiert oder nicht
for /f "tokens=2 delims=." %%i in ("%Datum%") do set "Monat=%%i"  
set "DoIt="  
for %%i in (01 04 07 10) do if %Monat%==%%i set "Doit=True"  

:: Überprüfung beider Bedingungen (zuerst Monat, dann Montag) mit jeweils zugeordneter Ausgabe (Aktion):
if defined DoIt (
    if %ErsterMontag%==1 (
		echo normales Backup 
		echo %time:~0,8%
        call :normales_Backup
    ) else (
        echo Backup mit Logverkleinerung 
		echo %time:~0,8%
		call :Backup_mit_Logverkleinerung
    )
) else (
    echo tue das andere
)


:Backup_mit_Logverkleinerung
REM ************************************************
REM ************************************************
REM Hier wird nur alle paar Monate reingesprungen und das Transaktionslog abgeschnitten.
REM ************************************************
REM ************************************************




::  ***** Datenbanken in Zwischenverzeichnis wegsichern ***** 
k:
cd..
cd..
cd..
cd..

cd mustermann
dbbackup -r -c "filedsn=firma1.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


dbbackup -r -c "filedsn=firma4.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


cd..

cd mst

dbbackup -r -c "filedsn=mst.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%

goto :Abschluss


:normales_Backup
REM ************************************************
REM ************************************************
REM Hier wird standardmaessig reingesprungen.
REM ************************************************
REM ************************************************

::  ***** Datenbanken in Zwischenverzeichnis wegsichern ***** 
k:
cd..
cd..
cd..
cd..

cd mustermann
dbbackup -c "filedsn=firma1.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


dbbackup -c "filedsn=firma4.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


cd..

cd mst

dbbackup -c "filedsn=mst.dsn;uid=admin;pwd=pword" -y J:\backup  
echo %time:~0,8%


goto :Abschluss








:Abschluss

REM ************************************************
REM ************************************************
REM die Programzeilen ab hier müssen IMMEr abgearbeitet werden.
REM ************************************************
REM ************



::  ***** aktuellste Datei Im Proficash-Backup-Verzeichnis finden und umkopieren ***** 

cd..
cd XPC
cd 0001

for /f "delims=" %%i in ('dir /a-d /b /od') do set Letzte_Datei=%%i  

Xcopy "%Letzte_Datei%" J:\Backup  






 

::  ***** Datenbanken in Zwischenverzeichnis umbenennen ***** 

ren J:\Backup\Firma1.db F1_Sicherung_%myDateTime%.db
ren J:\Backup\Firma1.log F1_Sicherung_%myDateTime%.log

ren J:\Backup\Firma4.db F4_Sicherung_%myDateTime%.db
ren J:\Backup\Firma4.log F4_Sicherung_%myDateTime%.log

ren J:\Backup\mst.db mst_Sicherung_%myDateTime%.db
ren J:\Backup\mst.log mst_Sicherung_%myDateTime%.log

echo %time:~0,8%






::  ***** Datenbanken komprimieren ***** 

%zippath%\7z.exe a J:\Backup\F1_Sicherung_%myDateTime%.zip J:\Backup\F1*.* 
%zippath%\7z.exe a J:\Backup\F4_Sicherung_%myDateTime%.zip J:\Backup\F4*.* 
%zippath%\7z.exe a J:\Backup\mst_%myDateTime%.zip J:\Backup\M*.* 
%zippath%\7z.exe a J:\Backup\Proficash_%myDateTime%.zip J:\Backup\prof*.sav 

del J:\Backup\*.db
del J:\Backup\*.log
del J:\Backup\*.sav


echo %time:~0,8%







::  ***** komprimierte Datenbanken aus Zwischenverzeichnis verteilen ***** 

xcopy J:\Backup\F1*.zip J:\Backup\F1\ /F /y
xcopy J:\Backup\F4*.zip J:\Backup\F4\ /F /y

xcopy J:\Backup\M*.zip J:\Backup\mst\ /F /y

xcopy J:\Backup\Prof*.zip J:\Backup\Proficash\ /F /y


xcopy J:\Backup\F1*.zip V:\Backup\F1\ /F /y
xcopy J:\Backup\F4*.zip V:\Backup\F4\ /F /y

xcopy J:\Backup\M*.zip V:\Backup\mst\ /F /y

xcopy J:\Backup\Prof*.zip V:\Backup\Proficash\ /F /y

echo %time:~0,8%






::  ***** Datenbanken aus Zwischenverzeichnis per FTP wegsichern und Zwischenverzeichnis leeren ***** 
::  ***** Achtung! Befehlssequenz liegt in der daten.ftp !! ***** 


ftp.exe -n -i -s:K:\batchdateien\DaSi\daten.ftp

echo %time:~0,8%






::  ***** Zwischenverzeichnis bereinigen  ***** 

J:
cd \Backup\ 
echo J | del *.*


cd...


echo %time:~0,8%






::  ***** Datensicherungen älter 30 Tagen entfernen ***** 

attrib -R -A -S -H J:\Backup\F1\*.* /S /D
attrib -R -A -S -H J:\Backup\F4\*.* /S /D

attrib -R -A -S -H J:\Backup\mst\*.* /S /D

attrib -R -A -S -H J:\Backup\Proficash\*.* /S /D


k:\DaSi\backups_aelter_als_30_tage_loeschen.vbs
ECHO.
echo %Date% %time:~0,8%
ECHO ************************************************************************************************
ECHO ************************************************************************************************
@ECHO ON



Gruss

McNugget
bastla
bastla 17.06.2010 um 07:45:00 Uhr
Goto Top
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
if defined DoIt if %ErsterMontag%==1 (
        echo normales Backup 
        echo %time:~0,8%
        goto :normales_Backup
)
echo Backup mit Logverkleinerung 
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 ...
McNugget
McNugget 17.06.2010 um 08:33:45 Uhr
Goto Top
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...
bastla
bastla 17.06.2010 um 09:24:53 Uhr
Goto Top
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
McNugget
McNugget 17.06.2010 um 10:41:08 Uhr
Goto Top
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.