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, 10042 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
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Userverwaltung
gelöst Mit der PoweShell die lokal angelegten Users eines anderen Rechners auflisten (7)

Frage von M.Marz zum Thema Windows Userverwaltung ...

Exchange Server
Exchange Problem nach Verschiebung auf anderen ESXi Host (8)

Frage von Leo-le zum Thema Exchange Server ...

Windows Server
Benutzerprofile auf anderen Server verschieben (1)

Frage von hermes zum Thema Windows Server ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...