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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
19 Kommentare
Neuester Kommentar
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:
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:
Grüße
bastla
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 ...
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"
bastla
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.
... 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
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]
- 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
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
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.
Gruß
LotPings
Edit: Bedingungen auf die Ausgangsfrage angepasst.
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.
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 ):
Beim Testen wird hier das Datum als Parameter übergeben:
Die Schleifenvariante schien mir dann aber leichter nachvollziehbar ...
Grüße
bastla
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 ):
@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
)
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:\>
Grüße
bastla
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
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
@Biber
Grüße
bastla
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
Hallo McNugget!
und weiter unten im Batch:
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
Wie würdet Ihr die beiden auszuwählenden Funktionen aufrufen???
Da wir darüber ja nicht besonders viel wissen, am ehesten:call :Funktion
:: 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:Kann mir das noch mal jemand erklären/auseiandersetzen?
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
Moin moin.
(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
Aber ich baue es jetzt in meinem obigen Batch ein.
Gruß
LotPings
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 ----- >%XY-Programm.."... hmmm...
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
Hallo McNugget!
Die Einzelteile zusammengefasst (inkl Ausgabe von "tue das andere" in allen relevanten Fällen) sähen dann etwa so aus:
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 ...
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
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 ...
Hallo McNugget!
Wenn Du nicht vor der Zeile 68 ein
einbaust, wird immer die "Logverkleinerungsvariante" zusätzlich ausgeführt - allerdings würde ich den gesamten Block (die Zeilen 53 bis 68) auf
reduzieren ...
Grüße
bastla
P.S.: Die ganze "
(oder gleich die Angabe eines absoluten Pfades - am Anfang des Batches und damit übersichtlich per Variablenzuweisung festgelegt) würde ich hier eher verwenden ...
Wenn Du nicht vor der Zeile 68 ein
goto :eof
if defined DoIt if %ErsterMontag%==1 (
echo normales Backup
echo %time:~0,8%
goto :normales_Backup
)
echo Backup mit Logverkleinerung
echo %time:~0,8%
Grüße
bastla
P.S.: Die ganze "
cd ..
"-Parade mutet etwas seltsam an - eincd ..\..\..\..\mustermann
Hallo McNugget!
... 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).
Grüße
bastla
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 "Damit springe ich doch an des Ende der Batchdatei, oder?
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