ahe
Goto Top

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

mfg
Axel

Content-ID: 31727

Url: https://administrator.de/forum/at-job-zu-einem-beliebigen-unbekannten-zeitpunkt-in-minuten-per-script-starten-31727.html

Ausgedruckt am: 26.12.2024 um 22:12 Uhr

Biber
Biber 04.05.2006 um 23:47:38 Uhr
Goto Top
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]
::-----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
Hope This Helps
Biber
[Edit] Führende Nullen bei Stunden/Minuten ergänzt (s.u.) [/Edit]
ahe
ahe 05.05.2006 um 09:41:37 Uhr
Goto Top
Aaahrg, der Modulo-Operator, bin ich blöd... face-smile

Vielen dank Biber für Deine schnelle Antwort, jetzt sieht der Code doch etwas aufgeräumter aus und funktioniert jetzt auch mit mehr als 59 Minuten!

Kleine Frage am Rande: Wann schläfst Du eigentlich auch 'mal... face-smile

Bislang habe ich die Befehle setlocal-endlocal nie verwendet, erspare ich mir damit tatsächlich das mühselige löschen meiner 'lokalen' Variablen? Funktioniert das auch in der selben Weise mit W2K-Rechnern? Unter XP habe ich jetzt ein wenig mit den Befehlen gespielt, die Online-Hilfe konsultiert und frage mich nur, wie man auf die letzte Zeile kommt...face-smile
nur so schaffst Du es schließlich die Variable auch 'außerhalb' gesetzt zu halten... (die Online-Hilfe sagt nix dazu (?))


Eine Kleinigkeit habe ich noch gefunden. Wenn die Zielzeit auf eine volle Stunde fällt, so sieht das so aus:
Time delay: 162
OldTime / New Time:  9:18 / 12:0

Allerdings wird im anschließen AT-Befehl der Wert 12:0 als 12:00 interpretiert, funktioniert also trotzdem.

mfg
Axel
Biber
Biber 05.05.2006 um 11:51:10 Uhr
Goto Top
Moin Axel,

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.
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 Vorgehensweise
und 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.
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:
:: ..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
ahe
ahe 05.05.2006 um 15:58:46 Uhr
Goto Top
Danke Dir für die Mühe,

es funktioniert!

Wie Du schon sagtest, bringen große Werte nix.

Beim Testen kommt für die Werte 10, 1450, 2890, 4330, etc. das Gleiche heraus, da man dann 24 Stunden übersprungen hat. face-smile !
D. h. mit den obigen Werten bekomme ich bei meinem AT-Job immer den gleichen Start-Zeitpunkt heraus ...


Wünsche ebenfalls ein schönes Wochenende
Axel
Biber
Biber 05.05.2006 um 16:36:31 Uhr
Goto Top
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... face-wink

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.