beatzler
Goto Top

Win Systemzeit aus Variable oder Textdatei setzen lassen

Hey,

könntet ihr mir ggf. bitte mal kurz eine Hilfestellung / einen richtigen Ansatz geben ?

Ich möchte eine Uhrzeit verarbeiten und als aktuelle Systemzeit setzen und dies am besten stündlich.

Folgende Situation. Eine Übergabevariable z.B. %9 enthält ein Datum und eine Uhrzeit im folgenden Format: 07.01.2010 01:45:38.

Diese Variable könnte ich z.B. in ein Textfile schreiben lassen und dieses dann "filtern" sodass nur noch die Uhrzeit stehen bleibt. Ist das sinnvoll oder kann man das ggf. gleich direkt mit der Variable %9 realisieren ?

Diese Uhrzeit soll dann als Systemzeit gesetzt werden.

Die Synchronisierung der Systemzeit mit einem Timeserver wurde schon deaktiviert.

Ich wollte mir jetzt eine kleine Batch schreiben welche halt die Zeit ausliest / schreibt oder verarbeitet und dann ggf. eine zweite Batch welche die Systemzeit dann setzt. Diese zweite Batch dann mittels Taskplan jede stunde einmal ausführen lassen ?!


Mein aktueller Ansatz sieht so aus:

[code]
@echo off
set zeit=00:00:00
time %zeit%
EXIT
[/code]

Es müsste jetzt irgendwie das Datum aus dem Parameter %9 wegfallen damit ich denn gleich für %zeit% ersetzen könne ?!

Vielen dank für jeden Tipp !

MFG Beatzler

Content-Key: 132848

Url: https://administrator.de/contentid/132848

Ausgedruckt am: 29.03.2024 um 12:03 Uhr

Mitglied: rubberman
rubberman 07.01.2010 um 02:42:50 Uhr
Goto Top
Hallo Beatzler

07.01.2010 01:45:38 wären (wegen des Leerzeichens) bereits zwei Parameter. Falls das in dieser Form bei dir ankommt, wäre das ja kein Problem, oder?

Aber gehen wir davon aus, dass das ganze in Anführungszeichen steht und so ankommt: "07.01.2010 01:45:38".
Konstruieren wir mal zwei Batches:

:: Aufruf.bat
@echo off &setlocal
Systime.bat P1 P2 P3 P4 P5 P6 P7 P8 "07.01.2010 01:45:38"  

:: Systime.bat
@echo off &setlocal
for /f "tokens=2" %%a in ("%~9") do ECHO time %%a  
pause

Aufruf.bat macht das, was der Name sagt. Beim Aufruf werden 9 Parameter an Systime.bat übergeben. P1 bis P8 stehen dabei für die von dir nicht genannten Parameter.
Durch das ECHO vor dem time-Befehl wird dir zunächst nur angezeigt, was eigentlich passieren würde.

Grüße
rubberman
Mitglied: Beatzler
Beatzler 07.01.2010 um 22:15:38 Uhr
Goto Top
Hey rubberman,

vielen dank für deine Hilfe face-smile

Das klappt wunderbar, perfekt !!!

Wäre es jetzt ggf. irgendwie noch relativ einfach möglich nur die stunden und minuten als Systemzeit zu verwenden, da während der Abarbeitung ja die Sekunden schon wieder zu schnell verstreichen ...

ausserdem kommt manchmal direkt hinter den Sekunden noch ein Fixtext den der Time Befehl dann natürlich nicht mag...

Vielen Dank dir erstmal !

MFG Beatzler
Mitglied: rubberman
rubberman 07.01.2010 um 22:43:48 Uhr
Goto Top
Hallo Beatzler.

Zitat von @Beatzler:
Wäre es jetzt ggf. irgendwie noch relativ einfach möglich nur die stunden und minuten als Systemzeit zu verwenden, da
während der Abarbeitung ja die Sekunden schon wieder zu schnell verstreichen ...

Soweit ich weiß akzeptiert der TIME Befehl nur das in der Registry angegebene Format. Wenn du also versuchst, nur Stunden und Minuten zu ändern, sollte das zu einem Fehler führen. Kannst ja mal testen.

Zur anderen Sache. Die Lösung mit der FOR Schleife ist nur eine von mehreren Möglichkeiten. Denkbar wäre auch:
:: Systime.bat
@echo off &setlocal
set "datetime=%~9"  
set "newtime=%datetime:~11,8%"  
ECHO time %newtime%
pause
Ich hoffe dass ich mich nicht verzählt habe face-wink
nach dem 11. Zeichen werden die folgenden 8 der Variablen %newtime% zugewiesen.

Grüße
rubberman
Mitglied: Beatzler
Beatzler 07.01.2010 um 22:48:15 Uhr
Goto Top
Hey,

okay danke für den Hinweis wenn ich bei time nur z.B. 00:00 eingebe und die Sekunden weglasse setzt er diese ebenfalls automatisch auch auf 00.

Ich denke ich werde es so belassen und dann die komplette Zeit übergeben auf die paar sekunden kommt es dann erstmal auch nicht mehr an ...

Vielen Dank für deine Hilfe !

MFG Beatzler
Mitglied: Beatzler
Beatzler 02.02.2010 um 10:47:54 Uhr
Goto Top
Hey,

diesbezüglich nochmals eine kurze Frage.

Wäre es irgendwie relativ einfach möglich eine Art überprüfung einzubauen das nur die Zeit aktualisiert wird wenn %9 vollständig ist ?

Das heißt wenn alle Stellen im ausgegebenen Format vorhanden sind z.B. so: 07.01.2010 01:45:38 und wenn dann z.B. nur das Datum in %9 steht oder irgendwo anders eine Zahl / Stelle fehlt das dann nicht die Systemzeit anpassung ausgeführt wird.

Aktueller Code: ( dank eurer Hilfe face-smile )

ECHO Letze Ausfuehrung: %9 > C:\Systemzeit\Log.txt

for /f "tokens=2" %%a in ("%~9") do ECHO %%a > C:\Systemzeit\Zeit.txt  

cscript //nologo C:\Systemzeit\Uhrfilter.vbs "C:\Systemzeit\Zeit.txt"  

for /f "delims=; " %%i in (C:\Systemzeit\Zeit.txt) do time %%i  

DEL C:\Systemzeit\Zeit.txt
EXIT

Vielen Dank im vorraus!

MFG Beatzler
Mitglied: rubberman
rubberman 09.02.2010 um 01:32:06 Uhr
Goto Top
Hallo Beatzler.

Sorry, hab erst jetzt gesehen, dass du hier noch mal gepostet hast.

Zum Thema. Du kannst den FINDSTR Befehl nutzen. Der versteht etwas RegEx.

echo %~9|findstr /r /c:"^[0-3][0-9]\.[01][0-9]\.2[0-9][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$">nul||goto :eof  

Diese Zeile beendet den Batch, wenn die Zeichenfolge nicht dem vorgesehenen Format entspricht.
Funktioniert in der Form aber nur bis zum Ende des Jahres 2999 face-wink

Grüße
rubberman
Mitglied: Beatzler
Beatzler 09.02.2010 um 12:32:53 Uhr
Goto Top
Hey,

vielen Dank für deine Antwort face-smile

Ich werde es einbauen und prüfen !

Dankeschön

MFG Beatzler
Mitglied: Beatzler
Beatzler 19.02.2010 um 09:55:06 Uhr
Goto Top
Hey Rubberman,

vielen dank nochmals für deine Super Hilfe ! Das klappt soweit genauso wie zunächst vorgesehen. face-smile

Wäre es jetzt aber ggf. auch noch irgendwie möglich das man aus der ausgewerteten Systemzeit / Datum ( %9 ) Die Zeit um eine Minute vor bzw. zurückstellen kann ( also entweder oder ... ) ??

Bekomms selber einfach nicht hin face-sad

Danke für einen Tipp !


MFG Beatzler
Mitglied: rubberman
rubberman 20.02.2010 um 01:54:54 Uhr
Goto Top
Hallo Beatzler.

Zitat von @Beatzler:
Wäre es jetzt aber ggf. auch noch irgendwie möglich das man aus der ausgewerteten Systemzeit / Datum ( %9 ) Die Zeit um
eine Minute vor bzw. zurückstellen kann ( also entweder oder ... ) ??

Mit den unmöglichsten Verrenkungen geht das vielleicht. Batch kann nicht mit DateTime-Werten rechnen. Das bedeutet, du musst immer prüfen, ob du mit der Minute über die Tages-, Monats- oder Jahresgrenze kommst. Jetzt denk mal an den Februar, der mal 28 und mal 29 Tage haben kann. Kurz gesagt: Batch ist hier eher letzte Wahl.
Implementiere ein kleines VBSCript in den Batch:
@echo off & setlocal

set "vbs=%temp%\AddMin.vbs"  
>%vbs% echo WScript.Echo FormatDateTime(DateAdd("n", WScript.Arguments(1), WScript.Arguments(0)), 0)  
for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" 1') do set "newTime=%%i"  
del %vbs%

echo %newTime%

pause
Wenn du die 1 zu -1 änderst, wird eine Minute abgezogen.

Grüße
rubberman
Mitglied: Beatzler
Beatzler 20.02.2010 um 16:50:23 Uhr
Goto Top
Hey,

das sieht super aus !! Echt klasse, vielen Dank !!

MFG Beatzler
Mitglied: Beatzler
Beatzler 22.02.2010 um 13:17:58 Uhr
Goto Top
Hey rubberman,

danke nochmals fürs skript aber ich glaube ich habe etwas falsch gemacht, irgendwie klappt es nicht so ganz, die Zeit wird zwar gesetzt aber es wird nicht um eine Minute verstellt:

:: Systime.bat
@echo off &setlocal

echo %~9|findstr /r /c:"^[0-3][0-9]\.[01][0-9]\.2[0-9][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$">nul||goto EXIT  

set "vbs=%temp%\AddMin.vbs"  
>%vbs% echo WScript.Echo FormatDateTime(DateAdd("n", WScript.Arguments(-1), WScript.Arguments(0)), 0)  
for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" -1') do set "newTime=%%i"  
del %vbs%

ECHO Letze Ausfuehrung: %9 > C:\Systemzeit\Log.txt 

:EXIT
EXIT

Vielen Dank für deinen Tipp....

MFG Beatzler
Mitglied: Biber
Biber 22.02.2010 um 14:12:16 Uhr
Goto Top
Moin Beatzler,

würde es etwas helfen, wenn du die Variable auch verwendest?

Hier jedenfalls in deiner Zeile 11:
ECHO Letze Ausfuehrung: %9 > C:\Systemzeit\Log.txt
... nutzt du sie noch nicht, sonst müsste die Zeile ja sinngemäß so aussehen:
ECHO Letzte Ausfyhrung: %newTime% > C:\Systemzeit\Log.txt

Grüße
Biber
Mitglied: Beatzler
Beatzler 22.02.2010 um 14:21:01 Uhr
Goto Top
Hey,

stimmt okay das war nicht sehr klug face-wink

habs nun gegen ECHO %time% ersetzt dann gibt er mir ja die aktuell verwendete Systemzeit aus...

Aber leider ändert das ja nichts daran das %9 immer noch genauso gesetzt wird ohne eine Minute abzuziehen oder hinzuzufügen.


Danke für jeden Tipp diesbezüglich !

MFG Beatzler
Mitglied: Biber
Biber 22.02.2010 um 14:55:39 Uhr
Goto Top
Moin Beatzler,

ich bin nicht sicher, ob du jetzt auch alle Codefragmente in der richtigen Reihenfolge zusammengeklöppelt hast...

Der Ablauf insgesamt sollte so sein:

  • irgendwo aus den Weiten des Weltalls wird neben vielem anderen Strandgut als Parameter 9 (%9) eine "Zeit"-Angabe mit in den Batch gespült
  • was auch immer mit den Parametern %1-%8 passieren mag, haben wir nicht diskutiert....aber wenn diese verarbeitung durch ist...
  • dann wird der Parameter %9 formal geprüft und wenn kein Fehler auftritt (dann würde "Goto exit" wirken)
  • wenn also kein Fehler, dann wird aus Parameter %9 nach Abziehen/Draufschlagen einer Minute die Variable %newtime%
  • und eigentlich müssste doch auch in irgendeinem Prozessschritt, in irgendeiner Phase diese %newtime% zum Setzen der Zeit verwendet werden? Wo machst du das denn?
  • erst als letztes kannst du dann diese neu gesetzte Zeit (diedann auch in der Variable %time% steht in dein Log-Krams schreiben.

Hast du bei dir auch ALLE diese Schritte und auch in dieser Reihenfolge?

Grüße
Biber
Mitglied: bastla
bastla 22.02.2010 um 14:59:31 Uhr
Goto Top
Hallo Beatzler!

Abgesehen von Bibers Anmerkungen: In dieser Zeile ist "-1" kontraproduktiv - lass das Minus weg:
>%vbs% echo WScript.Echo FormatDateTime(DateAdd("n", WScript.Arguments(-1), WScript.Arguments(0)), 0)
Grüße
bastla
Mitglied: Beatzler
Beatzler 22.02.2010 um 15:08:39 Uhr
Goto Top
Hallo ihr beiden,

vielen dank zunächst für eure Hilfe & Antworten !

Also Parameter 1-8 werden nicht benötigt, parameter 9 ist Datum und Zeit in einem mit Leerzeichen getrennt = "22.02.2010 14:56:40"

Eigentlich gibt es in meiner Batch auch nicht wirklich mehr als in den zuletzt von mir geposteten Quellcode....


Bastla´s ergänzung habe ich angepasst, leider ohne Erfolg.


Zitat von @Biber:

* dann wird der Parameter %9 formal geprüft und wenn kein Fehler auftritt (dann würde "Goto exit" wirken)

Es sollte nur zu EXIT gegangen werden wenn Fehler auftreten also wenn z.B. eine einzelne Zahl in den Werten fehlt oder nur Datum / Zeit ausgegeben werden, damit nicht eine falsche Zeit gesetzt wird.


Ich denke dochmal das %newtime% durch diese Zeile gesetzt wird oder nicht ?

for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" -1') do set "newTime=%%i"   

Danke nochmals MFG Beatzler
Mitglied: Beatzler
Beatzler 22.02.2010 um 15:15:24 Uhr
Goto Top
Achso ja jetzt verstehe ich was du meintest Biber!

Habe mal die besagte Zeitsetzungszeile folgendermaßen angepasst und teste / warte grade ob es so klappt:

for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" -1') do time %%i
Mitglied: bastla
bastla 22.02.2010 um 15:19:31 Uhr
Goto Top
Hallo Beatzler!
Bastla´s ergänzung habe ich angepasst, leider ohne Erfolg
Mit
:: Systime.bat
@echo off &setlocal

echo %~9|findstr /r /c:"^[0-3][0-9]\.[01][0-9]\.2[0-9][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$">nul||goto EXIT  

set "vbs=%temp%\AddMin.vbs"  
>%vbs% echo WScript.Echo FormatDateTime(DateAdd("n", WScript.Arguments(1), WScript.Arguments(0)), 0)  
for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" -1') do set "newTime=%%i"  
del %vbs%

ECHO Letze Ausfuehrung: %newTime%

:EXIT
wird bei einem Aufruf mit den Parametern
1 2 3 4 5 6 7 8 "22.02.2010 14:56:40"
bei mir folgende Ausgabe erzeugt:
Letze Ausfuehrung: 22.02.2010 14:55:40
Grüße
bastla
Mitglied: bastla
bastla 22.02.2010 um 15:27:42 Uhr
Goto Top
Hallo Beatzler!

Wenn Du den berechneten Zeitpunkt dann auch noch in das Log schreiben, willst eher so:
for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" -1') do set "newTime=%%i"  
for /f "tokens=1-2" %%i in ("%newtime%") do date %%i & time %%j  
Grüße
bastla
Mitglied: Beatzler
Beatzler 22.02.2010 um 15:35:56 Uhr
Goto Top
Mhhh also irgendwie klappt das alles noch nicht face-sad

Das Logfile ist erstmal nicht so wichtig, aber die Zeitumsetzung um 1 Minute vor oder zurück klappt leider immer nocht nicht face-sad

wenn ich es so mache: for /f "delims=" %%i in ('cscript //nologo %vbs% "%~9" -1') do time %%i übernimmt er gar nichts mehr und fragt die korrekte Zeit ab.

Wie setze ich denn nun den aktualisierten Zeitwert ( z.B. um eine Minute weniger ) richtig als Systemzeit ?!

MFG Beatzler
Mitglied: bastla
bastla 22.02.2010 um 16:30:16 Uhr
Goto Top
Hallo Beatzler!

Dass
time 22.02.2010 14:55:40
nicht funktionieren kann, ist klar - deshalb zB so wie gleich oberhalb gezeigt ...

Grüße
bastla
Mitglied: Beatzler
Beatzler 24.02.2010 um 09:43:18 Uhr
Goto Top
Hey,

also erstmal nochmal danke für eure Geduld und Unterstützung hier face-smile

Leider habe ich es jetzt immer noch nicht so ganz hinbekommen....

Aktuelles Problem ist noch das wie bastla schon sagte an time ja Datum UND Zeit übergeben wird obwohl es ja nur die Zeit sein muss ....

Nun vermute ich mal das du diese Zeile meintst :

for /f "tokens=1-2" %%i in ("%newtime%") do date %%i & time %%j

und deute sie so: nimm den 2. Teil hinter dem leerzeichen von %newtime% ( also nur noch die Zeit ) als j und setze die Zeit richtig ?


MFG Beatzler
Mitglied: bastla
bastla 24.02.2010 um 09:55:25 Uhr
Goto Top
Hallo Beatzler!
nimm den 2. Teil hinter dem leerzeichen von %newtime% ( also nur noch die Zeit ) als j und setze die Zeit richtig ?
Es werden Datum und Zeit gesetzt (wenn es schon mal ein kompletter Timestamp ist) - um tatsächlich nur die Zeit zu setzen:
for /f "tokens=2" %%i in ("%newtime%") do time %%i
Grüße
bastla
Mitglied: Beatzler
Beatzler 24.02.2010 um 12:11:35 Uhr
Goto Top
Hey,

fragt mich nicht wieso aber damit klappt es nun einwandfrei und wie gewünscht face-smile

VIelen Dank !!!

MFG Beatzler