Regelmäßiger Aufruf von Programmen, Skripten oder anderen Befehlen
Ich suchte ein Skript um in regelmäßigen Abständen einen Befehl auszuführen. Dabei soll der Prozess nachgeholt werden, wenn der Prozess zur ursprünglichen Zeit nicht ausgeführt werden konnte.
Ich hoffe das Skript ist nicht zu unsauber programmiert und kann jemandem nützlich sein.
Dieses Skript ruft einen Befehl (bzw. ein Skript oder Programm) nach einem gewünschten Zeit-Abstand wieder auf. Dazu muss das Skript (ich habe es regelmaessigerAufruf genannt) wiederum von einem Windows-Task aufgerufen werden. Der Vorteil zu einem einfach Windows-Task ist halt, dass der Befehl auch dann ausgeführt wird, wenn der Task zum geplanten Zeitpunkt nicht ausgeführt werden konnte.
So richtet man den Windows Task ein:
Ich hoffe das Skript ist nicht zu unsauber programmiert und kann jemandem nützlich sein.
Dieses Skript ruft einen Befehl (bzw. ein Skript oder Programm) nach einem gewünschten Zeit-Abstand wieder auf. Dazu muss das Skript (ich habe es regelmaessigerAufruf genannt) wiederum von einem Windows-Task aufgerufen werden. Der Vorteil zu einem einfach Windows-Task ist halt, dass der Befehl auch dann ausgeführt wird, wenn der Task zum geplanten Zeitpunkt nicht ausgeführt werden konnte.
Einrichtung
Ich beschreibe hier mal exemplarisch wie man das Skript verwenden kann für die Einrichtung eines Backups (%BACKUPBEFEHL%
soll aufgerufen werden):So richtet man den Windows Task ein:
- Man erstelle einen neuen Task (Systemsteuerung -> Geplante Tasks) welches regelmaessigerAufruf.bat regelmäßig aufruft (genaue Konfiguration folgt im Punkt 2!).
- Wenn man den Task erstellt hat kann man ihn öffnen und vernünftig konfigurieren:
- Reiter: Task
- Ausführen: e:\Programme\regelmaessigerAufruf.bat 147
%BACKUPBEFEHL%
604800 j u
Wobei hier e:\Programme\ der Ort ist, wo bei mir regelmaessigerAufruf.bat und datums_diff.bat gespeichert ist.
147 ist eine zufällige natürliche Zahl, die zur Identifizierung des Auftrags von regelmaessigerAufruf.bat verwendet wird. Jeder Auftrag sollte muss eine eindeutige Nummer haben, wenn sie sich nicht die letzte Ausführungszeit teilen sollen.%BACKUPBEFEHL%
ist der Befehl für das Backup
604800 die gewünschte Zeit in Sekunden zwischen zwei Aufrufen des Backups.
j steht dafür, dass der Benutzer - falls die Zeit gekommen ist - gefragt wird ob er das Skript auch wirklich jetzt starten will. Sonst wird er halt später wieder gefragt (dann wenn regelmaessigerAufruf.bat wieder vom Windows Task aufgerufen wird).
u steht dafür, dass die die Zeitdifferenz überprüft wird. Um das zu umgehen muss dieser Parameter auf z gesetzt werden. - Ausführen in: da wo das Backup-Programm gespeichert ist
- Nur ausführen wenn angemeldet: Gesetzt
- Aktiviert: Gesetzt
- Reiter: Zeitplan (mehrere Zeitpläne)
- Im Leerlauf starten (nach 5min)
- Täglich ab dem 19.10.2009 00:00, Erweitert: Wiederholungsintervall Alle 1 Stunden, Dauer: 23:59
- Reiter: Einstellungen:
Kein Häckchen gesetzt.
Erweiterung
Statt%BACKUPBEFEHL%
kann man eine vorher erstellte Verknüpfung starten (zb %BACKUPBEFEHL%
.lnk). In den Eigenschaften der Verknüpfung stellt man die Ausführung auf minimiert. So kommt nicht immer das Fenster in den Vordergrund.Das gleiche Prozedere kann man mit regelmaessigerAufruf.bat machen. Dies ist aber nicht zu empfehlen, da man dann die Fragestellung ob man das Backup wirklich jetzt machen möchte nicht mehr so gut mit.
Code
regelmaessigerAufruf.bat braucht noch ein weiteres Skript: datums_diff.bat. Dieses Skript habe ich im Administrator Forum in dem Beitrag Zeit-Differenz zwischen Zeit- und Datumsangaben mit Batchprogramm berechnen schon vorgestellt! Beide sollten in dem selben Ordner sein. In dem oben genannten Beispiel: %SYSTEMDRIVE%\Programme\@echo off
setlocal
@REM BESCHREIBUNG: Dieses Skript soll ein gewünschtes Programm im Abstand von gewünschten Sekunden aufrufen. Dazu erstellt man einen (Windows-)Task, welches dieses Skript regelmäßig aufruft. Z.B. beim Starten des Computers oder alle paar Stunden. Dieses Skript überprüft wie viele Tage es her ist, dass das Programm erfolgreich aufgerufen wurde und ruft das Programm ggf. auf.
@REM Version 0.9.11.03 20091123
@REM Zu übergeben sind 5 PARAMETER:
@REM 1. Parameter: Eine eindeutige Auftrags-ID. Dies ist eine beliebige natürliche Zahl, die es ermöglichen soll, dieses Skript auf verschiedene Programme und/oder verschiedene Abstände auszuführen. Damit kann man z.B. dieses Skript für ein und das selbe Programm alle 3 Tage und alle 10 Tage ausführen.
@REM 2. Parameter: Kompletter Pfad zum Programm, welches Aufgerufen werden soll.
@REM 3 Parameter: Gewünschter Zeitraum zwischen zwei erfolgreichen Aufrunfen (in Sekunden, natürliche Zahl).
@REM 4 Parameter: Angabe, ob vor dem Start des Programms nachgefragt werde soll (j/n)
@REM 5 Parameter: Angabe, ob der Auftrag unabhängig von der verstrichenen Zeit ausgeführt werden soll. Die neue Zeit wird aber übernommen. Ist zum Beispiel nützlich, wenn ein wöchentliches Backup schon früher ausgeführt werden soll. Danach werden aber wieder 7 Tage gewartet! Der 4. Parameter wird dabei ignoriert.
@REM Die Parameter müssen in der richtigen Reihenfolge übergeben werden!
@REM Beispiel-Aufruf: regelmaessigerAufruf.bat 123 "ping localhost" 10 n u
@REM Hier wird eine Beschreibung des Skripts ausgegeben, wenn dem Skript keine Parameter übergeben wurden
if not "%1" == "" (
echo %0 wurde gestartet.
) else (
@REM Gebe aus, wie man das Programm bedient.
echo BESCHREIBUNG: Dieses Skript soll ein gewünschtes Programm im Abstand von gewünschten Sekunden aufrufen. Dazu erstellt man einen ^(Windows-^)Task, welches dieses Skript regelmäßig aufruft. Z.B. beim Starten des Computers oder alle paar Stunden. Dieses Skript überprüft wie viele Tage es her ist, dass das Programm erfolgreich aufgerufen wurde und ruft das Programm ggf. auf.
echo Version 0.9.11.02 20091115
echo Author: Ringelkrat
echo Zu übergeben sind 5 PARAMETER:
echo 1. Parameter: Eine eindeutige Auftrags-ID. Dies ist eine beliebige natürliche Zahl, die es ermöglichen soll, dieses Skript auf verschiedene Programme und/oder verschiedene Abstände auszuführen. Damit kann man z.B. dieses Skript für ein und das selbe Programm alle 3 Tage und alle 10 Tage ausführen.
echo 2. Parameter: Kompletter Pfad zum Programm, welches Aufgerufen werden soll.
echo 3 Parameter: Gewünschter Zeitraum zwischen zwei erfolgreichen Aufrunfen ^(in Sekunden, natürliche Zahl^).
echo 4 Parameter: Angabe, ob vor dem Start des Programms nachgefragt werde soll ^(j/n^)
echo 5 Parameter: Angabe, ob der Auftrag unabhängig von der verstrichenen Zeit ausgeführt werden soll. Die neue Zeit wird aber übernommen. Ist zum Beispiel nützlich, wenn ein wöchentliches Backup schon früher ausgeführt werden soll. Danach werden aber wieder 7 Tage gewartet! Der 4. Parameter wird dabei ignoriert.
echo.
echo %0 wurde nicht korrekt aufgerufen und hat deswegen nur den Hilfetext ausgegeben.
goto ende
)
@REM Das Programm speichert die Informationen, wann ein Auftrag zuletzt abgespeichert wurde in
set appPath=%APPDATA%\regelmaessigerAufruf
set logfile=log.txt
:schreibeDatum
if exist "%appPath%" goto OrdnerVorhanden
mkdir "%appPath%"
echo Der Ordner wurde erstellt.
:OrdnerVorhanden
if not exist "%appPath%\%logfile%" (
echo > "%appPath%\%logfile%"
echo Die Datei "%logfile%" wurde in "%appPath%" erstellt.
)
@REM Das Programm hat 3 Teile:
@REM 1. Einlesen des alten Datums und berechnen der Differenz
@REM 2. ggf. Programm ausführen
@REM 3. ggf. neues Datum schreiben
set dateiname=letzterAufruf%1.txt
if %5 EQU z (
set q=j
goto ausfuehren
)
call :wieSpaet
if not exist "%appPath%\%dateiname%" goto fragen2
for /F "usebackq delims=" %%i in ("%appPath%\%dateiname%") do set altesDatum=%%i
@REM BERECHNEN DER DIFFERENZ
@REM Berechne die Differenz (in Sekunden) und rechne diese dann in Tagen um
call E:\Programme\datums_diff.bat %jetzt% %altesDatum%
if %result% GTR %3 (goto fragen1)
set /a stunden=((%3 - %result%)/3600)
set /a "minuten=(%3 - %result% -(3600*%stunden%))/60
set /a "sekunden=(%3 - %result% -(60*((60*%stunden%)+%minuten%)))
echo Es fehlen noch %stunden%:%minuten%:%sekunden% bis zur nächsten Ausführung!
goto ende
:fragen1
@REM führe das eigentliche Programm aus
set /a stunden=((%result%)/3600)
set /a "minuten=(%result% -(3600*%stunden%))/60
set /a "sekunden=(%result% -(60*((60*%stunden%)+%minuten%)))
set q=j
if /i %4 EQU j set /p q=Der Prozess %2 ^(ID:%1^) wurde schon seit %stunden%:%minuten%:%sekunden% nicht mehr erfolgreich ausgeführt. Möchten Sie ihn jetzt starten? (j/n):
goto ausfuehren
:fragen2
set q=j
if /i %4 EQU j set /p q=Der Prozess %2 ^(ID:%1^) wurde noch nie erfolgreich ausgeführt. Möchten Sie ihn jetzt starten? (j/n):
:ausfuehren
if /i %q% EQU j (
call :wieSpaet
echo %2 wird um %jetzt% gestartet...
call %~2
) else (
echo %jetzt% : %2 ^(ID:%1^) wurde NICHT ausgeführt. Abbruch durch Benutzer. >> "%appPath%\%logfile%"
echo %jetzt% : %2 ^(ID:%1^) wurde NICHT ausgeführt. Abbruch durch Benutzer.
goto ende
)
if %errorlevel%==0 (
echo %jetzt% : %2 ^(ID:%1^) wurde erfolgreich ausgeführt. >> "%appPath%\%logfile%"
echo %jetzt% : %2 ^(ID:%1^) wurde erfolgreich ausgeführt.
@REM schreibe das aktuelle Datum
echo %jetzt% > "%appPath%\%dateiname%"
) else (
echo %jetzt% : %2 ^(ID:%1^) wurde NICHT erfolgreich ausgeführt ^(ErrorLevel=%ERRORLEVEL%^)! >> "%appPath%\%logfile%"
echo %jetzt% : %2 ^(ID:%1^) wurde NICHT erfolgreich ausgeführt ^(ErrorLevel=%ERRORLEVEL%^)!
pause
)
goto ende
:wieSpaet
@REM EINLESEN DES DATUMS
@REM Lese das jetzige Datum aus
set mydate=%date%
set dd=%mydate:~0,2%
set mo=%mydate:~3,2%
set yyyy=%mydate:~6,4%
@REM Lese die jetzige Zeit aus
set mytime=%time%
set hh=%mytime:~0,2%
if "%hh:~0,1%"==" " set hh=0%hh:~1,1%
set mi=%mytime:~3,2%
set ss=%mytime:~6,2%
set jetzt=%dd%.%mo%.%yyyy% %hh%:%mi%:%ss%
goto :eof
:end_wieSpaet
:ende
endlocal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131008
Url: https://administrator.de/contentid/131008
Ausgedruckt am: 23.11.2024 um 08:11 Uhr