AT Job zu einem beliebigen (unbekannten) Zeitpunkt in Minuten per Script starten
Eine kleine nur suboptimale Lösung...
Ich hatte das Problem, dass ich während eines Scriptlaufs (Installation von div. Softwarepaketen) irgendwann ein weiteres Script starten mußte. Das Hauptscript sollte allerdings nicht durch start /wait auf das Ende des zweiten Scripts warten, sondern ruhig fertig werden.
Darum wollte ich den AT Befehl verwenden. Allerdings muß ich beim AT Befehl eine feste Zeit angeben, d. h. eine feste Uhrzeit, ein Datum oder ein Wochentag. Ich wollte aber, dass es in ein paar Minuten von JETZT an loslief...
Ich stellte mir den Aufruf im Hauptscript so vor:
Die timeadd.cmd:
Ein kleines Problem bleibt, wenn ich eine Zahl größer 59 (Minuten) eingebe, gibt es ein Problem mit der Zeitberechnung, daher fange ich dies durch die Abfragen if %factor% GTR 59 goto DELAY_ERR ab. Dies ist nicht besonders elegant, aber es funktioniert.
Da ich die Lösung für suboptimal halte und der Code sicher auch an anderer Stelle nicht ganz geschickt ist, frage ich Euch, ob ich nicht auf etwas einfachere Art und Weise besser zum Ziel komme und vielleicht die Beschränkung auf 59 Minuten nicht habe.
Z. zt. 'sehe' ich die einfache Lösung nicht...
mfg
Axel
Ich hatte das Problem, dass ich während eines Scriptlaufs (Installation von div. Softwarepaketen) irgendwann ein weiteres Script starten mußte. Das Hauptscript sollte allerdings nicht durch start /wait auf das Ende des zweiten Scripts warten, sondern ruhig fertig werden.
Darum wollte ich den AT Befehl verwenden. Allerdings muß ich beim AT Befehl eine feste Zeit angeben, d. h. eine feste Uhrzeit, ein Datum oder ein Wochentag. Ich wollte aber, dass es in ein paar Minuten von JETZT an loslief...
Ich stellte mir den Aufruf im Hauptscript so vor:
:: Start meiner Zeitadditionsbatch mit dem Parameter 12 (Minuten).
:: Die Batch timeadd.cmd soll dabei eine Umgebungsvariable newTime erzeugen, die die aktuelle Zeit plus 12 Minuten
:: errechnet, d. h. auch ggfs. den Stunden- und Tages-Wechsel beinhaltet (manche Scripts laufen auch Nachts... :-))
call %~dp0\timeadd.cmd 12
:: Aufruf des AT Befehls mit der neuen Umgebungsvariable
at %newTime% /interactive "notepad.exe"
Die timeadd.cmd:
@echo off
goto START
************************************************************************************
* Create a own time variable 'newTime'.
*
* You can add some minutes (0-59) to your local time, write this new time in a
* variable 'newTime' and use the variable as parameter for AT (or something else).
*
* Start: timeadd <min>
* minutes between 0 and 59
*
* Preparations: OS = Windows XP
*
************************************************************************************
:START
set zeit="%time%"
if "%1" == "" goto DELAY
set factor=%1
goto TIMEADD
:DELAY
echo Input time delay between 1 and 59:
set /P factor=
if %factor% GTR 59 goto DELAY_ERR
goto TIMEADD
:TIMEADD
if %factor% GTR 59 goto DELAY_ERR
echo **************** Calculations ************************
echo.
echo Actual Time: %zeit%
echo.
For /F "Tokens=1,2 Delims=:" %%J In (%zeit%) Do (
Set hour=%%J
Set minutes=%%K
)
set /A newminutes=("factor" + "minutes")
if %newminutes% GTR 59 goto MAXMINUTE
set newTime=%hour%:%newminutes%
goto END
:MAXMINUTE
set /A newminutesless=("newminutes" - "60")
set /A newhourplus=("hour" + "1")
if (%newhourplus% GTR 23) set newhourplus=0
set newTime=%newhourplus%:%newminutesless%
goto END
:DELAY_ERR
goto DELAY
:END
echo.
echo Time delay: %factor%
echo.
echo New Time: %newTime%
set newhourplus=
set hour=
set newminutes=
set factor=
set newminutesless=
set minutes=
set zeit=
Ein kleines Problem bleibt, wenn ich eine Zahl größer 59 (Minuten) eingebe, gibt es ein Problem mit der Zeitberechnung, daher fange ich dies durch die Abfragen if %factor% GTR 59 goto DELAY_ERR ab. Dies ist nicht besonders elegant, aber es funktioniert.
Da ich die Lösung für suboptimal halte und der Code sicher auch an anderer Stelle nicht ganz geschickt ist, frage ich Euch, ob ich nicht auf etwas einfachere Art und Weise besser zum Ziel komme und vielleicht die Beschränkung auf 59 Minuten nicht habe.
Z. zt. 'sehe' ich die einfache Lösung nicht...
mfg
Axel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 31727
Url: https://administrator.de/contentid/31727
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
5 Kommentare
Neuester Kommentar
Moin Axel,
habe mal Deinen Ansatz übernommen und den Code etwas zusammengedampft.
So sollte es tun, was Dir vorschwebt.
Der Display/Output ist natürlich nur jetzt zur Demo sinnvoll.
Der Wert der Variablen %newTime% ist nach dem Aufruf global gesetzt, d.h. Du kannst auch diesen AddMinutes.bat aus einem anderen Batch aufrufen sinngemäß so:
call c:\batches\addminutes.bat 88 >nul
REM ab hier ist dann die Variable %newTime% verfügbar.
[Edit]
Sorry..hatte Deinen Hauptbatch überlesen... aber genau so hätte ich es auch konzipiert.
Das Bätschelchen kann natürlich auch weiterhin time2Add.cmd heißen.
[/Edit]
Aufruf am CMD-Prompt (mit Parameter):
Hope This Helps
Biber
[Edit] Führende Nullen bei Stunden/Minuten ergänzt (s.u.) [/Edit]
habe mal Deinen Ansatz übernommen und den Code etwas zusammengedampft.
So sollte es tun, was Dir vorschwebt.
Der Display/Output ist natürlich nur jetzt zur Demo sinnvoll.
Der Wert der Variablen %newTime% ist nach dem Aufruf global gesetzt, d.h. Du kannst auch diesen AddMinutes.bat aus einem anderen Batch aufrufen sinngemäß so:
call c:\batches\addminutes.bat 88 >nul
REM ab hier ist dann die Variable %newTime% verfügbar.
[Edit]
Sorry..hatte Deinen Hauptbatch überlesen... aber genau so hätte ich es auch konzipiert.
Das Bätschelchen kann natürlich auch weiterhin time2Add.cmd heißen.
[/Edit]
::-----snipp AddMinutes.bat
@echo off & setlocal
goto START
************************************************************************************
* Create a own time variable 'newTime'.
*
* You can add some minutes (0-59) to your local time, write this new time in a
* variable 'newTime' and use the variable as parameter for AT (or something else).
*
* Start: timeadd <min>
* minutes between 0 and 59
*
* Preparations: OS = Windows XP
* Minor suggestions by Beaver 2006 / Biberware -- Placed in the Public Domain
************************************************************************************
:START
if "%1" == "" goto ask4DELAY
set /a delayMins=%1 +0
if delayMins==0 goto ask4DELAY
goto TIMEADD
:ask4DELAY
set /P "delayMins=Input time delay between 1 and whatever in mins: "
:TIMEADD
For /F "Tokens=1,2 Delims=:" %%J In ("%time%") Do (
Set hour=%%J
Set minutes=%%K
)
set /a delayhours=0
set /a newMins=%delayMins% + %minutes%
if %newMins% GTR 59 set /a delayHours=%newMins%/60
if %newMins% GTR 59 set /a newMins=%newMins% %% 60
set /a newhour=(%hour%+%delayHours%) %% 24
::[Edit] NEU sind die nächsten zwei Zeilen:
If %newhour% LEQ 9 set newhour=0%newhour%
If %newmins% LEQ 9 set newmins=0%newmins%
:: führende "0" ergänzen, falls Stunde/Minute kleiner gleich 9 (also einstellig) [/Edit]
set newTime=%newhour%:%newmins%
echo.
echo Time delay: %delayMins%
echo OldTime / New Time: %hour%:%minutes% / %newTime%
Endlocal & set newTime=%newTime%
::-----snapp AddMinutes.bat
Aufruf am CMD-Prompt (mit Parameter):
C:\Temp>addminutes 123
Time delay: 123
OldTime / New Time: 23:51 / 1:54
Biber
[Edit] Führende Nullen bei Stunden/Minuten ergänzt (s.u.) [/Edit]
Moin Axel,
Doch, funktioniert wirklich.
..die anderen kleinen Bugs/Verbesserungspotentiale:
- konzeptionell: ich würde ganz auf den interaktiven Part verzichten.
Wenn der Benutzer keinen/keinen numerischen Parameter angibt, dann halt 5 Minuten oder so als Default annehmen. Fertig. Sonst riskierst Du immer, dass dieser Hilfsbatch von irgendwo aufgerufen wird (z.B. nachts um 03:45 als Task) und gar keiner da ist, der dann eine Zahl eintippen will. Und der Batch wartet....
- "Input time delay between 1 and whatever in mins: "
Ist in zweifacher Hinsicht geschwindelt.
a) ist der Algorithmus nur für "kleinere" Minuten-Angaben gedacht. Wer dort 10000 oder 250000 Minuten angibt, dessen AT-Kommando wird nicht in Tagen oder Monaten starten, sondern innerhalb von 48 Stunden. Es ließen sich zwar auch problemlos Tage und Datumswerte aufaddieren und berechnen...aber dafür ist es ja nicht gedacht.
b) die "1 Minute" ist M$-technisch unerreichbar. Da die Jungs und Mädels in Redmond wesentlich schlechter programmieren als Du und ich zusammen, geht jeder zweite Aufruf eines Tasks mit einer Startzeit von weniger als 2 Minuten (ab Anlegen/Abschicken) in die Grütze.
Minimum ist also 2 Minuten (und das sollte auch so geprüft werden). Andernfalls startet der Task nicht in einer Minute, sondern in 24 Stunden...thats M$.
Schönes Wochenende
Biber
Bislang habe ich die Befehle setlocal-endlocal nie verwendet,
erspare ich mir damit tatsächlich das mühselige löschen meiner 'lokalen' Variablen?
Ja! Schon das sollte ein hinreichender Grund sein, das zu verwenden.erspare ich mir damit tatsächlich das mühselige löschen meiner 'lokalen' Variablen?
Funktioniert das auch in der selben Weise mit W2K-Rechnern?
Klar. M$ achtet immer auf Kompatibilität... *pruuuuuuuuuuuuuuuuuust*Doch, funktioniert wirklich.
Unter XP habe ich jetzt ein wenig mit den Befehlen gespielt, die Online-Hilfe konsultiert
...ist die richtige Vorgehensweiseund frage mich nur, wie man auf die letzte Zeile kommt...
..10% weibliche Intuition und 90% männliche Transpiration beim Ausprobieren...nur so schaffst Du es schließlich die Variable auch 'außerhalb' gesetzt zu halten...
(die Online-Hilfe sagt nix dazu (?))
Wenig Dokumentation==Wenig Falschaussagen==Wenig Kritik. Alte Entwicklerstrategie.(die Online-Hilfe sagt nix dazu (?))
Eine Kleinigkeit habe ich noch gefunden.
Eine? Habe aber vier kleine Bugs dringelassen, nicht einen....Wenn die Zielzeit auf eine volle Stunde fällt, so sieht das so aus:
Time delay: 162
OldTime / New Time: 9:18 / 12:0
Ja, das ist unschön.. Abhilfe:Time delay: 162
OldTime / New Time: 9:18 / 12:0
:: ..vor der Ausgabe von %newTime%:
...
set /a newhour=(%hour%+%delayHours%) %% 24
::NEU sind die nächsten zwei Zeilen:
If %newhour% LEQ 9 set newhour=0%newhour%
If %newmins% LEQ 9 set newmins=0%newmins%
:: führende "0" ergänzen, falls Stunde/Minute kleiner gleich 9 (also einstellig)
set newTime=%newhour%:%newmins%
..die anderen kleinen Bugs/Verbesserungspotentiale:
- konzeptionell: ich würde ganz auf den interaktiven Part verzichten.
Wenn der Benutzer keinen/keinen numerischen Parameter angibt, dann halt 5 Minuten oder so als Default annehmen. Fertig. Sonst riskierst Du immer, dass dieser Hilfsbatch von irgendwo aufgerufen wird (z.B. nachts um 03:45 als Task) und gar keiner da ist, der dann eine Zahl eintippen will. Und der Batch wartet....
- "Input time delay between 1 and whatever in mins: "
Ist in zweifacher Hinsicht geschwindelt.
a) ist der Algorithmus nur für "kleinere" Minuten-Angaben gedacht. Wer dort 10000 oder 250000 Minuten angibt, dessen AT-Kommando wird nicht in Tagen oder Monaten starten, sondern innerhalb von 48 Stunden. Es ließen sich zwar auch problemlos Tage und Datumswerte aufaddieren und berechnen...aber dafür ist es ja nicht gedacht.
b) die "1 Minute" ist M$-technisch unerreichbar. Da die Jungs und Mädels in Redmond wesentlich schlechter programmieren als Du und ich zusammen, geht jeder zweite Aufruf eines Tasks mit einer Startzeit von weniger als 2 Minuten (ab Anlegen/Abschicken) in die Grütze.
Minimum ist also 2 Minuten (und das sollte auch so geprüft werden). Andernfalls startet der Task nicht in einer Minute, sondern in 24 Stunden...thats M$.
Kleine Frage am Rande: Wann schläfst Du eigentlich auch 'mal...
...wenn ich das Gefühl habe, dass meine Codeschnipsel stabil laufen..Schönes Wochenende
Biber
Gern geschehen, Axel,
ich denke, so eine "Starte-in-ein-paar-Minuten"-Mimik kann ich auch selbst noch mal brauchen und bestimmt auch noch ein oder zwei andere Mitleser.
Ich habe diese Führende-Nullen-Ergänzung oben im Script nachgezogen und setze Deinen Beitrag mal auf "Gelöst".
Hm... mit diesem Schnipsel im LoginScript kann ich eigentlich jedem Benutzer schon beim Anmelden einen Task mit auf den Weg geben, dass nach 240 Minuten (=4 Stunden Bildschirmarbeit) automatisch der Bildschirm dunkel wird... damit die auch regelmäßig Pause machen...
Schön, gleich nette Ideen für nächste Woche... Nun kann es aber erstmal Wochenende werden...
Biber
P.S. Und dafür, dass endlich mal jemand von sich aus schreibt "..es funktioniert" und nicht "..es geht.." oder "..es funkt"...
... dafür gebe ich mal eine Runde Sterne aus... Danke dafür.
ich denke, so eine "Starte-in-ein-paar-Minuten"-Mimik kann ich auch selbst noch mal brauchen und bestimmt auch noch ein oder zwei andere Mitleser.
Ich habe diese Führende-Nullen-Ergänzung oben im Script nachgezogen und setze Deinen Beitrag mal auf "Gelöst".
Hm... mit diesem Schnipsel im LoginScript kann ich eigentlich jedem Benutzer schon beim Anmelden einen Task mit auf den Weg geben, dass nach 240 Minuten (=4 Stunden Bildschirmarbeit) automatisch der Bildschirm dunkel wird... damit die auch regelmäßig Pause machen...
Schön, gleich nette Ideen für nächste Woche... Nun kann es aber erstmal Wochenende werden...
Biber
P.S. Und dafür, dass endlich mal jemand von sich aus schreibt "..es funktioniert" und nicht "..es geht.." oder "..es funkt"...
... dafür gebe ich mal eine Runde Sterne aus... Danke dafür.