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

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

Mitglied: ahe

ahe (Level 1) - Jetzt verbinden

04.05.2006, aktualisiert 05.05.2006, 8522 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...

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

mfg
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 ..
Ähnliche Inhalte
Ubuntu
Bacula Jobs starten nicht mehr
Frage von D1Ck3nUbuntu1 Kommentar

Hallo zusammen, ich habe das Problem, dass manche meiner Bacula Jobs nicht mehr starten und dadurch auch keine Sicherung ...

Windows Server

Script für zentrales Runterfahren der Rechner zu einem gewissen Zeitpunkt

gelöst Frage von Stefan007Windows Server10 Kommentare

Hallo Leute, da ich mit Programmierung nicht wirklich viel am Hut habe außer einem "Hello World!" ;), suche ich ...

Batch & Shell

START-JOB Übergreifendes Powershell Skript ?

gelöst Frage von today12Batch & Shell3 Kommentare

Hallo liebe Freunde, ich brauche ein paar gute Antworten. Besser gesagt: eure Hilfe, da ich entweder falsch "G00G13" oder ...

CPU, RAM, Mainboards

PC automatisch zu beliebiger Uhrzeit starten - Brainstorming

Frage von mabue88CPU, RAM, Mainboards4 Kommentare

Hi, bin mir nicht sicher unter welchem Thema ich die Frage stellen soll. Also bitte verschieben, wenn ich das ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 2 TagenWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 2 TagenAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 3 TagenHumor (lol)5 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 3 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Router & Routing
Router auf Orginal Firmware zurück flashen mit Tftpd
Frage von ILeonardRouter & Routing21 Kommentare

Hallo, Ich habe zwei Router, einmal TP-Link 841n v11 und TP-Link 940N v5. Ich wollte fragen, ob jemand mir ...

Router & Routing
WRT keine Verbindung zum Web Interface
gelöst Frage von ILeonardRouter & Routing18 Kommentare

Hallo, Ich habe einen TP-Link WR841n mit wrt geflasht, das Problem ist ich kann mich mit 192.168.1.1 nicht verbinden. ...

Windows Server
Standortvernetzung zu einem Strato VServer (Windows)
Frage von matzefratze81Windows Server10 Kommentare

Moin, ich komme aus einem Enterprise-Umfeld und habe den Fehler gemacht, dass ich mich auf ein kleines Unternehmen eingelassen ...

TK-Netze & Geräte
Telefonie zweier Fritzboxen mit je eigenem DSL Anschluss verbinden
Frage von hannsgmaulwurfTK-Netze & Geräte10 Kommentare

Hallo zusammen, ich habe hier einen Haushalt mit zwei Anschlüssen. Einmal ISDN, einmal DSL. An jedem Anschluss hängt eine ...