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

Tipp Entwicklung Batch & Shell

Mitglied: Ringelkrat

Ringelkrat (Level 1) - Jetzt verbinden

05.12.2009, aktualisiert 25.07.2013, 10236 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
Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 10 StundenInternet2 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 13 StundenDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Windows 10

Microsoft bestätigt DMA-Policy-Problem in Win10 v1709

Information von DerWoWusste vor 13 StundenWindows 10

Wer sein Gerät mit der DMA-Policy absichert, bekommt evtl. Hardwareprobleme in v1709 von Win10. Warum? Weil v1709 endlich "richtig" ...

Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 17 StundenVerschlüsselung & Zertifikate

Interessant Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows SSH-Kommando in CMD.exe und PowerShell

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server16 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

TK-Netze & Geräte
VPN-fähige IP-Telefone
Frage von the-buccaneerTK-Netze & Geräte14 Kommentare

Hi! Weiss noch jemand ein VPN-fähiges IP-Telefon mit dem man z.B. einen Heimarbeitsplatz gesichert anbinden könnte? Habe nur einen ...