Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Ringelkrat

Ringelkrat (Level 1) - Jetzt verbinden

05.12.2009, aktualisiert 25.07.2013, 10303 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
Batch & Shell
Kleines Treesize Bash Skript
Tipp von MKLindnerBatch & Shell1 Kommentar

Ich Gebe euch mal ein kleines Bash Skript: Vielleicht Hilft es jemandem Viel Spass damit

Sonstige Systeme

VARIA hat pfSense aus dem Programm genommen

Information von KuemmelSonstige Systeme56 Kommentare

Moin Jungs, der Händler VARIA hat seine pfSense-Lösungen aus dem Programm genommen. Warum? Keine Ahnung! Ich habe den Händler ...

Sicherheitsgrundlagen

Programm ohne UAC und Administratorrechte starten

Anleitung von agowa338Sicherheitsgrundlagen3 Kommentare

Hallo, ich denke, jeder kennt das Problem, ein Programm das die UAC aufpoppen lässt ohne dass es wirklich Administrator ...

Batch & Shell

Powershell: Fritz!Box Telnet-Befehle ausführen lassen

Tipp von colinardoBatch & Shell

Für alle die es brauchen können und keine externen Tools außer nativer Powershell verwenden möchten, hier eine Funktion die ...

Neue Wissensbeiträge
CPU, RAM, Mainboards
Neverending story
Tipp von keine-ahnung vor 12 StundenCPU, RAM, Mainboards1 Kommentar

Da kommt man mit dem fixen gar nicht mehr hinterher und die CPU erreichen wieder Rechenleistungen im Bereich des ...

Multimedia & Zubehör
AVM Fritz USB WLAN Sticks schneller einschalten
Tipp von NetzwerkDude vor 2 TagenMultimedia & Zubehör4 Kommentare

Die AVM Fritz WLAN Sticks haben in der Firmware 2 Modis: Einmal als Massenspeicher und einmal als WLAN Netzwerkkarte ...

Windows Server

Windows Server Backup schlägt fehl - Lösung 2008-2016

Tipp von BiGnoob vor 2 TagenWindows Server

Hi zusammen , ich möchte gerne einen Lösungstipp abgeben für folgenden Fehler: Lösung ist folgende:

Humor (lol)
Telekom vs. O2 - 3:2
Erfahrungsbericht von the-buccaneer vor 2 TagenHumor (lol)4 Kommentare

Unglaublich aber wahr: Nachdem mein privater Anschluss am 19.04.18 auf VOIP und VDSL umgestellt wurde, hatte ich seitdem 1,5 ...

Heiß diskutierte Inhalte
PHP
Nach Umzug zu 1und1 bekomme ich beim Eintrag in die DB Tabelle folgenden Fehler
gelöst Frage von jensgebkenPHP35 Kommentare

INSERT command denied to user 'dbo45342345342231244'@'112.127.102.073' for table 'orders'

Rechtliche Fragen
DSGVO - Impressum und Datenschutz auf Anmeldeseiten notwendig?
Frage von StefanKittelRechtliche Fragen16 Kommentare

Hallo, was mit gerade eingefallen ist. Muss man auf Anmeldeseiten auch ein Impressum und Datenschutzhinweis haben? Auch hier wird ...

Windows Userverwaltung
Problem mit Benutzerprofil
Frage von lieferscheinWindows Userverwaltung12 Kommentare

Guten Tag liebe Community, folgendes Problem habe ich: User meldet sich auf Client A an - sein Homelaufwerk verbindet. ...

Windows Server
2003er RDS Server lässt alten ThinClient nach Updates nicht mehr anmelden
Frage von KnorkatorWindows Server9 Kommentare

Hallo zusammen, wir hatten die Aufgabe, ein System (keine Domänenanbindung) zu virtualisieren welches mehrere Jahre keine Updates gesehen hat. ...