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

Regelmäßiger Aufruf von Programmen, Skripten oder anderen Befehlen

Tipp Entwicklung Batch & Shell

Mitglied: Ringelkrat

Ringelkrat (Level 1) - Jetzt verbinden

05.12.2009, aktualisiert 25.07.2013, 10138 Aufrufe, 1 Danke

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.

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:
  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.

    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\
    01.
    @echo off 
    02.
    setlocal 
    03.
    @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. 
    04.
    @REM Version 0.9.11.03 20091123 
    05.
    @REM Zu übergeben sind 5 PARAMETER: 
    06.
    @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. 
    07.
    @REM 2. Parameter: Kompletter Pfad zum Programm, welches Aufgerufen werden soll. 
    08.
    @REM 3 Parameter: Gewünschter Zeitraum zwischen zwei erfolgreichen Aufrunfen (in Sekunden, natürliche Zahl). 
    09.
    @REM 4 Parameter: Angabe, ob vor dem Start des Programms nachgefragt werde soll (j/n) 
    10.
    @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. 
    11.
    @REM Die Parameter müssen in der richtigen Reihenfolge übergeben werden! 
    12.
     
    13.
    @REM Beispiel-Aufruf:  regelmaessigerAufruf.bat 123 "ping localhost" 10 n u 
    14.
     
    15.
    @REM Hier wird eine Beschreibung des Skripts ausgegeben, wenn dem Skript keine Parameter übergeben wurden 
    16.
    if not "%1" == "" (  
    17.
    	echo %0 wurde gestartet.  
    18.
    ) else (  
    19.
    	@REM Gebe aus, wie man das Programm bedient. 
    20.
    	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. 
    21.
    	echo Version 0.9.11.02 20091115 
    22.
    	echo Author: Ringelkrat 
    23.
    	echo Zu übergeben sind 5 PARAMETER: 
    24.
    	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. 
    25.
    	echo 2. Parameter: Kompletter Pfad zum Programm, welches Aufgerufen werden soll. 
    26.
    	echo 3 Parameter: Gewünschter Zeitraum zwischen zwei erfolgreichen Aufrunfen ^(in Sekunden, natürliche Zahl^). 
    27.
    	echo 4 Parameter: Angabe, ob vor dem Start des Programms nachgefragt werde soll ^(j/n^) 
    28.
    	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. 
    29.
    	echo. 
    30.
    	echo %0 wurde nicht korrekt aufgerufen und hat deswegen nur den Hilfetext ausgegeben. 
    31.
    	goto ende 
    32.
    33.
     
    34.
    @REM Das Programm speichert die Informationen, wann ein Auftrag zuletzt abgespeichert wurde in 
    35.
    set appPath=%APPDATA%\regelmaessigerAufruf 
    36.
    set logfile=log.txt 
    37.
    :schreibeDatum 
    38.
    if exist "%appPath%" goto OrdnerVorhanden 
    39.
    	mkdir "%appPath%" 
    40.
    	echo Der Ordner  wurde erstellt. 
    41.
    :OrdnerVorhanden 
    42.
    if not exist "%appPath%\%logfile%" ( 
    43.
    	echo > "%appPath%\%logfile%" 
    44.
    	echo Die Datei "%logfile%" wurde in "%appPath%" erstellt. 
    45.
    46.
     
    47.
    @REM Das Programm hat 3 Teile: 
    48.
    @REM 1. Einlesen des alten Datums und berechnen der Differenz 
    49.
    @REM 2. ggf. Programm ausführen 
    50.
    @REM 3. ggf. neues Datum schreiben 
    51.
     
    52.
    set dateiname=letzterAufruf%1.txt 
    53.
     
    54.
    if %5 EQU z ( 
    55.
    	set q=j 
    56.
    	goto ausfuehren 
    57.
    58.
     
    59.
    call :wieSpaet 
    60.
     
    61.
    if not exist "%appPath%\%dateiname%" goto fragen2 
    62.
    for /F "usebackq delims=" %%i in ("%appPath%\%dateiname%") do set altesDatum=%%i  
    63.
     
    64.
    @REM BERECHNEN DER DIFFERENZ 
    65.
    @REM Berechne die Differenz (in Sekunden) und rechne diese dann in Tagen um 
    66.
    call E:\Programme\datums_diff.bat %jetzt% %altesDatum% 
    67.
    if %result% GTR %3 (goto fragen1)  
    68.
     
    69.
    set /a stunden=((%3 - %result%)/3600) 
    70.
    set /a "minuten=(%3 - %result% -(3600*%stunden%))/60 
    71.
    set /a "sekunden=(%3 - %result% -(60*((60*%stunden%)+%minuten%))) 
    72.
    echo Es fehlen noch %stunden%:%minuten%:%sekunden% bis zur nächsten Ausführung! 
    73.
    goto ende 
    74.
     
    75.
    :fragen1 
    76.
    @REM führe das eigentliche Programm aus 
    77.
    set /a stunden=((%result%)/3600) 
    78.
    set /a "minuten=(%result% -(3600*%stunden%))/60 
    79.
    set /a "sekunden=(%result% -(60*((60*%stunden%)+%minuten%))) 
    80.
    set q=j 
    81.
    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): 
    82.
    goto ausfuehren 
    83.
    :fragen2 
    84.
    set q=j 
    85.
    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): 
    86.
    :ausfuehren 
    87.
    if /i %q% EQU j (  
    88.
        call :wieSpaet 
    89.
    	echo %2 wird um %jetzt% gestartet... 
    90.
    	call %~2  
    91.
    ) else ( 
    92.
    	echo %jetzt% : %2 ^(ID:%1^) wurde NICHT ausgeführt. Abbruch durch Benutzer. >> "%appPath%\%logfile%" 
    93.
    	echo %jetzt% : %2 ^(ID:%1^) wurde NICHT ausgeführt. Abbruch durch Benutzer. 
    94.
    	goto ende 
    95.
    96.
    if %errorlevel%==0 ( 
    97.
    	echo %jetzt% : %2 ^(ID:%1^) wurde erfolgreich ausgeführt. >> "%appPath%\%logfile%" 
    98.
    	echo %jetzt% : %2 ^(ID:%1^) wurde erfolgreich ausgeführt. 
    99.
    	@REM schreibe das aktuelle Datum  
    100.
    	echo %jetzt% > "%appPath%\%dateiname%" 
    101.
    ) else ( 
    102.
    	echo %jetzt% : %2 ^(ID:%1^) wurde NICHT erfolgreich ausgeführt ^(ErrorLevel=%ERRORLEVEL%^)! >> "%appPath%\%logfile%" 
    103.
    	echo %jetzt% : %2 ^(ID:%1^) wurde NICHT erfolgreich ausgeführt ^(ErrorLevel=%ERRORLEVEL%^)! 
    104.
    	pause 
    105.
    106.
    goto ende 
    107.
     
    108.
    :wieSpaet 
    109.
    @REM EINLESEN DES DATUMS 
    110.
    @REM Lese das jetzige Datum aus 
    111.
    set mydate=%date% 
    112.
    set dd=%mydate:~0,2% 
    113.
    set mo=%mydate:~3,2% 
    114.
    set yyyy=%mydate:~6,4% 
    115.
     
    116.
    @REM Lese die jetzige Zeit aus 
    117.
    set mytime=%time% 
    118.
    set hh=%mytime:~0,2% 
    119.
    if "%hh:~0,1%"==" " set hh=0%hh:~1,1% 
    120.
    set mi=%mytime:~3,2% 
    121.
    set ss=%mytime:~6,2% 
    122.
     
    123.
    set jetzt=%dd%.%mo%.%yyyy% %hh%:%mi%:%ss% 
    124.
    goto :eof 
    125.
    :end_wieSpaet 
    126.
     
    127.
    :ende 
    128.
    endlocal
Ähnliche Inhalte
Basic
Programmierung von Windows Programmen (13)

Frage von Ghost108 zum Thema Basic ...

Exchange Server
Exchange 2013 Installation am anderen Standort vorbereiten (3)

Frage von BlackRain zum Thema Exchange Server ...

Multimedia & Zubehör
MIDI-Controller mit 2 Programmen verwenden (2)

Frage von peterla zum Thema Multimedia & Zubehör ...

Neue Wissensbeiträge
Batch & Shell

Batch - ein paar Basics die man kennen sollte

Tipp von Pedant zum Thema Batch & Shell ...

Microsoft

Restrictor: Profi-Schutz für jedes Window

(5)

Tipp von AlFalcone zum Thema Microsoft ...

Batch & Shell

Batch zum Zurücksetzen eines lokalen Profils

Tipp von Mr.Error zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft Office
Saubere HTML aus Word-Dokument (16)

Frage von peterpa zum Thema Microsoft Office ...

Router & Routing
ASUS RT-N18U mit VPN Client hinter Fritzbox - Portforwarding (15)

Frage von marshall75000 zum Thema Router & Routing ...

Hosting & Housing
gelöst Webserver bei WIX, aber DNS Server wo anders (9)

Frage von laster zum Thema Hosting & Housing ...