ringelkrat
Goto Top

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.

back-to-topEinrichtung

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:
  1. Man erstelle einen neuen Task (Systemsteuerung -> Geplante Tasks) welches regelmaessigerAufruf.bat regelmäßig aufruft (genaue Konfiguration folgt im Punkt 2!).
  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)
      1. Im Leerlauf starten (nach 5min)
      2. Täglich ab dem 19.10.2009 00:00, Erweitert: Wiederholungsintervall Alle 1 Stunden, Dauer: 23:59
    • Reiter: Einstellungen:
      Kein Häckchen gesetzt.

    back-to-topErweiterung

    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.

    back-to-topCode

    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

Content-Key: 131008

Url: https://administrator.de/contentid/131008

Printed on: April 19, 2024 at 10:04 o'clock