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
GELÖST

AT Job zu einem beliebigen (unbekannten) Zeitpunkt in Minuten per Script starten

Frage Entwicklung Batch & Shell

Mitglied: ahe

ahe (Level 1) - Jetzt verbinden

04.05.2006, aktualisiert 05.05.2006, 8325 Aufrufe, 5 Kommentare, 8 Danke

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:
01.
:: Start meiner Zeitadditionsbatch mit dem Parameter 12 (Minuten). 
02.
:: Die Batch timeadd.cmd soll dabei eine Umgebungsvariable newTime erzeugen, die die aktuelle Zeit plus 12 Minuten 
03.
:: errechnet, d. h. auch ggfs. den Stunden- und Tages-Wechsel beinhaltet (manche Scripts laufen auch Nachts... :-)) 
04.
call %~dp0\timeadd.cmd 12 
05.
 
06.
:: Aufruf des AT Befehls mit der neuen Umgebungsvariable 
07.
at %newTime% /interactive "notepad.exe"

Die timeadd.cmd:
01.
@echo off 
02.
goto START 
03.
 
04.
************************************************************************************ 
05.
* Create a own time variable 'newTime'.    
06.
07.
* You can add some minutes (0-59) to your local time, write this new time in a      
08.
* variable 'newTime' and use the variable as parameter for AT (or something else).    
09.
*                                                                                   
10.
* Start: timeadd <min>                                                             
11.
*         minutes between 0 and 59                                                  
12.
*                                                                                   
13.
* Preparations: 	OS = Windows XP                                             
14.
*                                                                                   
15.
************************************************************************************ 
16.
 
17.
:START 
18.
set zeit="%time%" 
19.
 
20.
if "%1" == "" goto DELAY 
21.
 
22.
set factor=%1 
23.
goto TIMEADD 
24.
 
25.
:DELAY 
26.
echo Input time delay between 1 and 59: 
27.
set /P factor= 
28.
 
29.
if %factor% GTR 59 goto DELAY_ERR 
30.
goto TIMEADD 
31.
 
32.
 
33.
:TIMEADD 
34.
if %factor% GTR 59 goto DELAY_ERR 
35.
echo **************** Calculations ************************ 
36.
echo. 
37.
echo Actual Time: %zeit% 
38.
echo. 
39.
 
40.
For /F "Tokens=1,2 Delims=:" %%J In (%zeit%) Do ( 
41.
     Set hour=%%J 
42.
     Set minutes=%%K 
43.
   )  
44.
 
45.
set /A newminutes=("factor" + "minutes") 
46.
 
47.
if %newminutes% GTR 59 goto MAXMINUTE 
48.
set newTime=%hour%:%newminutes% 
49.
goto END 
50.
 
51.
 
52.
:MAXMINUTE 
53.
set /A newminutesless=("newminutes" - "60") 
54.
set /A newhourplus=("hour" + "1") 
55.
 
56.
if (%newhourplus% GTR 23) set newhourplus=0 
57.
 
58.
set newTime=%newhourplus%:%newminutesless% 
59.
goto END 
60.
 
61.
:DELAY_ERR 
62.
goto DELAY 
63.
 
64.
 
65.
:END 
66.
echo. 
67.
echo Time delay: %factor% 
68.
echo. 
69.
echo New Time: %newTime% 
70.
 
71.
set newhourplus= 
72.
set hour= 
73.
set newminutes= 
74.
set factor= 
75.
set newminutesless= 
76.
set minutes= 
77.
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...

Mit freundlichen Grüßen
Axel
Mitglied: Biber
04.05.2006 um 23:47 Uhr
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]
01.
::-----snipp AddMinutes.bat 
02.
@echo off & setlocal 
03.
goto START 
04.
 
05.
************************************************************************************ 
06.
* Create a own time variable 'newTime'.    
07.
08.
* You can add some minutes (0-59) to your local time, write this new time in a      
09.
* variable 'newTime' and use the variable as parameter for AT (or something else).    
10.
*                                                                                   
11.
* Start: timeadd <min>                                                             
12.
*         minutes between 0 and 59                                                  
13.
*                                                                                   
14.
* Preparations:     OS = Windows XP                                             
15.
* Minor suggestions by Beaver 2006 / Biberware -- Placed in the Public Domain                                                                                  
16.
************************************************************************************ 
17.
 
18.
:START 
19.
if "%1" == "" goto ask4DELAY 
20.
set /a delayMins=%1 +0 
21.
if delayMins==0 goto ask4DELAY 
22.
goto TIMEADD 
23.
 
24.
:ask4DELAY 
25.
set /P "delayMins=Input time delay between 1 and whatever in mins: " 
26.
:TIMEADD 
27.
For /F "Tokens=1,2 Delims=:" %%J In ("%time%") Do ( 
28.
     Set hour=%%J 
29.
     Set minutes=%%K 
30.
   )  
31.
set /a delayhours=0 
32.
set /a newMins=%delayMins% + %minutes% 
33.
if %newMins% GTR 59 set /a delayHours=%newMins%/60 
34.
if %newMins% GTR 59 set /a newMins=%newMins% %% 60 
35.
set /a newhour=(%hour%+%delayHours%) %% 24 
36.
::[Edit] NEU sind die nächsten zwei Zeilen: 
37.
If %newhour% LEQ 9 set newhour=0%newhour% 
38.
If %newmins% LEQ 9 set newmins=0%newmins% 
39.
:: führende "0" ergänzen, falls Stunde/Minute kleiner gleich 9 (also einstellig) [/Edit] 
40.
set newTime=%newhour%:%newmins% 
41.
echo. 
42.
echo Time delay: %delayMins% 
43.
echo OldTime / New Time: %hour%:%minutes% / %newTime% 
44.
Endlocal & set newTime=%newTime% 
45.
::-----snapp AddMinutes.bat
Aufruf am CMD-Prompt (mit Parameter):
01.
C:\Temp>addminutes 123 
02.
 
03.
Time delay: 123 
04.
OldTime / New Time: 23:51 / 1:54
Hope This Helps
Biber
[Edit] Führende Nullen bei Stunden/Minuten ergänzt (s.u.) [/Edit]
Bitte warten ..
Mitglied: ahe
05.05.2006 um 09:41 Uhr
Aaahrg, der Modulo-Operator, bin ich blöd...

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...

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...
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:
01.
Time delay: 162 
02.
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.

Mit freundlichen Grüßen
Axel
Bitte warten ..
Mitglied: Biber
05.05.2006 um 11:51 Uhr
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:
01.
:: ..vor der Ausgabe von %newTime%: 
02.
... 
03.
set /a newhour=(%hour%+%delayHours%) %% 24 
04.
::NEU sind die nächsten zwei Zeilen: 
05.
If %newhour% LEQ 9 set newhour=0%newhour% 
06.
If %newmins% LEQ 9 set newmins=0%newmins% 
07.
:: führende "0" ergänzen, falls Stunde/Minute kleiner gleich 9 (also einstellig) 
08.
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
Bitte warten ..
Mitglied: ahe
05.05.2006 um 15:58 Uhr
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. !
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
Bitte warten ..
Mitglied: Biber
05.05.2006 um 16:36 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
Access ein Script alle X Minuten ausführen und bei Bedarf stoppen (5)

Frage von thomas1972 zum Thema Microsoft Office ...

LAN, WAN, Wireless
Script bei starten einer VPN Verbindung mit Checkpoint-VPN Client (2)

Frage von maddig zum Thema LAN, WAN, Wireless ...

Windows Server
gelöst Rechner neu starten per Script via Aufgabenplanung klappt nicht (4)

Frage von MaxKlaus13 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 ...

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

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Haures zum Thema Windows Server ...