power-poler
Goto Top

Mittels Batch Zeit bis ausgeben

Guten Tag
Bin neu hier, und habe mir mittels Batch einen Script geschrieben, der eine Zeit bis zu einem Datum runter zählt.
Naja, selbst geschrieben nur Teilweise, der groß teil stammt hier aus dem Forum, den ich zusammen kopiert habe (ich hoffe das ist erlaubt)

Wollte jetzt mal fragen, ob sich mal jemand den Script anschauen könnte, und mir eventuelle Tipps gegen kann, was sich verbessern liese.
Zurzeit flackert es ziemlich und sieht daher nicht gut aus.
Auch habe ich die befürchte, das ich mir damit das System zerschießen kann, wenn der Script länger wie einige Stunden läuft. (endlos schleife)
Der Großteil ist von hier:
Über Batch die vergangene Zeit zwischen zwei Daten berechnen

Dort habe ich dan sozusagen meinen teil noch mit angehängt.
So sieht es bisher aus:
@echo off
:Test
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set test2=%time:~0,2%:%time:~3,2%:%time:~6,2%
set Test=%tag%.%monat%.%jahr%-%test2%
::echo %Test%
set "Von=%Test%"   
set "Bis=18.04.2011-13:49:02"   

set G=%temp%\GetTimeDiff.vbs 

>%G% echo D=CDate(Replace(WScript.Arguments(1),"-"," "))-CDate(Replace(WScript.Arguments(0),"-"," ")):WScript.Echo Int(D)^&" "^&Hour(D)^&" "^&Minute(D)^&" "^&Second(D)   

for /f "tokens=1-4" %%a in ('cscript //nologo %G% "%Von%" "%Bis%"') do echo %%a Tage %%b Stunden %%c Minuten %%d Sekunden  
sleep.exe 1
cls
goto Test

Die zweite Frage wäre, rechnet er richtig? 91 Tage scheint mir etwas lang zu sein.
Auch zählt er manchmal 2s runter, was auch nicht sein soll.
Schonmal Danke für eine Antwort
Mfg
Power-Poler
Achso
BS: Windows 7 Home Premium 64bit (Falls die Befehle von BS zu BS abweichen können)

Content-Key: 158751

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

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: 76109
76109 16.01.2011 um 17:32:41 Uhr
Goto Top
Hallo Power-Poler!

Also, mit dem heutigem Tag gerechnet sind es 92 Tage und wenn Du das Script in Codezeile 17 (1 Sekunde Pause) jedesmal für eine Sekunde anhälts, dann ist es kein Wunder, dass es ab und an 1 Sekunde überspringtface-wink

Und anstatt runterzuzählen meinst Du sicherlich hochzählen (von Heute - bis April)

Könnte man in etwa so zusammenfassen:
@echo off & setlocal
set G=%temp%\GetTimeDiff.vbs 
set "Bis=18.04.2011 13:49:02"   

>%G% echo WScript.Echo Join(Array(DateDiff("d", Now, CDate(WScript.Arguments(0))), Hour(Time), Minute(Time), Second(Time)))  

:Test
for /f "tokens=1-4" %%a in ('cscript //nologo %G% "%Bis%"') do echo %%a Tage %%b Stunden %%c Minuten %%d Sekunden  

Rem sleep.exe 1 
Rem cls 
Rem goto Test

Gruß Dieter

[edit] Auf Bibers Anregung hin entsprechend geändert [/edit]

@Biber
Hab ich wohl etwas geschlafen face-wink
Mitglied: Biber
Biber 16.01.2011 um 17:38:11 Uhr
Goto Top
Moin Power-Puler,

willkommen im Forum.
Ergänzend zu didi1954:

Es ist nicht nötig, dass temporäre VBS-Snippet innerhalb der Looperei jede Sekunde neu zu schreiben.
Das kann einmalig außerhalb (= also vor) der Sprungmarke "Test"" passieren.

Grüße
Biber
Mitglied: Power-Poler
Power-Poler 16.01.2011 um 18:11:59 Uhr
Goto Top
Erstmal Danke für eure antworten.
Der Script von didi funktioniert leider nicht.
Zum einen Schlisst sich das Fenster sofort wider.
Zum anderen, habe ich auch oben vergessen da zuzuschreiben, wenn ich ein pause ans ende hänge Aktualisieren es sich nicht mehr.
Es bleibt auf der Zeit stehen.
Was ich jetzt nicht ganz nachvollziehen kann, warum bei dem Script von didi 92 Tage raus kommen, und bei "meinem" 91.
Also kann sein das ich etwas auf dem Schlauch stehe:
"Und anstatt runterzuzählen meinst Du sicherlich hochzählen (von Heute - bis April)"
Aber ich meine, es soll mir die Zeit auf die Sekunde angeben, wie lange es noch bis zu oben genannten Datum Dauert.
also "jetzt" 92 Tage 12 Stunden 33 Minuten 35 Sekunden
und in 1 Stunde 2 min 3 sek
92 Tage 11 Stunden 31 Min 32 Sekunden.
Und jede Sekunde soll es sich Aktualisieren.
Habe jetzt mal die rem's entfernt. Jetzt startet der Script auch.
Nur er zählt hoch, also vorne steht 92 Tage XX Stunden XX Min und die Sekunden zählen hoch.
Welche Zeit ist das den bitte?
Mitglied: rubberman
rubberman 16.01.2011 um 18:34:57 Uhr
Goto Top
Hallo Power-Poler, hallo Didi und Biber.

Um das Flackern zu verhindern kannst du mit dem Erzeugung von ESC,CR,LF und DEL mit reinem Batch Zeichen arbeiten (was unter Win7 nicht mehr so einfach ist, da CR und White Spaces in SET /P als erste Zeichen eliminiert werden).
Alle anderen Vorschläge mal mit eingebunden könnte das so aussehen:
@echo off &setlocal enabledelayedexpansion

set "Bis=18.04.2011 13:49:02"  

:: CR erzeugen
for /f %%a in ('copy /z "%~f0" nul') do set "cr=%%a"  

:: VBScript erzeugen
set G=%temp%\GetTimeDiff.vbs 
>%G% echo D=CDate(WScript.Arguments(0))-Now:WScript.Echo Int(D)^&" "^&Hour(D)^&" "^&Minute(D)^&" "^&Second(D)  

:Test
:: VBScript aufrufen
for /f "tokens=1-4" %%a in ('cscript //nologo "%G%" "%Bis%"') do set "output=%%a Tage %%b Stunden %%c Minuten %%d Sekunden"  
:: alte Ausgabe überschreiben
<nul set /p ".=.!cr!                                                  !cr!"  
:: neue Ausgabe schreiben
<nul set /p ".=%output%"  
goto Test

Grüße
rubberman

<EDIT: Zeile 10 angepasst. />
Mitglied: Power-Poler
Power-Poler 16.01.2011 um 18:49:14 Uhr
Goto Top
Danke dafür
Jetzt flackert es schon mal weniger.
Aber er zählt immer noch hoch.
Er soll runter zählen. Also auf dieses Datum hin.
Ein Countdown

Ähh, ok, jetzt gehst.
Bin wohl beim Kopieren irgendwo in der Zeile verrutscht. Aber jetzt tut er genau das was ich wollte.
Danke Leute für eure Hilfe.

100% lässt sich das Flackern wohl nicht beheben, oder?
Mitglied: rubberman
rubberman 16.01.2011 um 19:00:31 Uhr
Goto Top
ARRGH! Sorry, habe Didi's Script ungetestet übernommen.
Hab's jetzt oben im Script angepasst.

Grüße
rubberman
Mitglied: Power-Poler
Power-Poler 16.01.2011 um 19:09:20 Uhr
Goto Top
OK, Danke funktioniert
was komisch ist, der Text im code wurde aktualisiert, das du es editiert hast wurde aber noch nicht angezeigt.
Mitglied: rubberman
rubberman 16.01.2011 um 19:11:25 Uhr
Goto Top
Das wird auch nicht automatisch angezeigt (soll heißen, ich habe es nachträglich dazu geschrieben).

Grüße
rubberman
Mitglied: 76109
76109 16.01.2011 um 19:24:43 Uhr
Goto Top
Hallo Power-Poler!

Sorry, da stand ich wohl irgendwie auf der Leitung, aber rubbermann hat's ja gerichtetface-wink

Gruß Dieter
Mitglied: C.R.S.
C.R.S. 16.01.2011 um 19:39:15 Uhr
Goto Top
Hallo,

es wird eine Stunde zu viel angezeigt, da die Sommerzeitumstellung nicht berücksichtigt ist.

Grüße
Richard
Mitglied: Power-Poler
Power-Poler 16.01.2011 um 20:05:27 Uhr
Goto Top
Auf die Stunde genau kommt es nicht an.
Aber danke für den Hinweis.
Wegen dem Flackern noch mal.
Habe jetzt noch einen Text hinten dran eingefügt.
for /f "tokens=1-4" %%a in ('cscript //nologo "%G%" "%Bis%"') do set "output=%%a Tage %%b Stunden %%c Minuten %%d Sekunden xxx xxx yyyy yyydfsfsdfsdfsdfy"
es flackert aber meistens nur bis hinter xxx ab y ist es nicht so häufig. Gibs dafür eine Erklärung, bzw läst es sich ausnutzen um das Flackern abzustellen?
Läst sich über einen Umweg, also zum Beispiel das ganze in einer Variablen Zwischenspeichern, das Flackern fillecht abstelle?
Mitglied: rubberman
rubberman 16.01.2011 um 20:17:06 Uhr
Goto Top
Hallo Power-Poler.

Das Flackern lässt sich nicht ganz abstellen und dass das Flackern nicht über die gesamte Ausgabe kommt liegt daran, dass du durch deine Erweiterung nicht mehr die gesamte Zeile überschreibst, was aber andererseits zu einer fehlerhaften Ausgabe führt (wenn du mal einen sinnvollen Text dran hängst, wirst du es merken). Du musst die Anzahl der Leerzeichen zwischen dem ersten und dem zweiten !cr! entsprechend erhöhen.

Grüße
rubberman
Mitglied: jeb-the-batcher
jeb-the-batcher 17.01.2011 um 01:16:21 Uhr
Goto Top
Hallo zusammen,

das Flackern läßt sich ganz abstellen.

Man darf nur bei der Ausgabe nicht erst löschen und dann neu schreiben, sondern jeweils nur einmal mit dem neuen Inhalt überschreiben.
Dazu sollte man aber den neuen Inhalt an die Länge anpassen.

Also in etwa
set "spaces=                               "  
set "output=!output!!spaces!"  

<nul set /p ".=!output:~0,40!!cr!"  
Schreibt also jeweils 40 Zeichen in die Zeile

Oder als Test
@echo off
SETLOCAL EnableDelayedExpansion
cls
set "spaces=                               "  

for /f %%a in ('copy /z "%~f0" nul') do set "cr=%%a"  
for /L %%n in (1,1,100000) DO (
	set "output=Die aktuelle Zahl ist %%n"  
	set "output=!output!!spaces!"  

	<nul set /p ".=!output:~0,40!!cr!"  
)

Grüße
jeb
Mitglied: rubberman
rubberman 17.01.2011 um 01:23:29 Uhr
Goto Top
Hallo jeb.

Richtig. Aber diese Form führt dazu, dass der Cursor immer am Zeilenanfang steht, was bei langsamen Schleifen (wie die vom TO) dazu führt, dass er dort sichtbar wird. In meinen Augen auch nicht schöner face-sad

Grüße
rubberman
Mitglied: 76109
76109 17.01.2011 um 07:44:13 Uhr
Goto Top
Hallo zusammen!

Hier mal ne Lösung in HTA (*.hta) ohne flackern:
<html>
<head>
<title>Countdownzähler</title>
<HTA:APPLICATION
     ID = "objAutoRefresh"  
     ApplicationName = "Countdownzähler"  
     SCROLL = "no"  
     SINGLEINSTANCE="yes"/>  
</head>

<SCRIPT LANGUAGE="VBScript">  
    Sub Window_OnLoad()
        Window.ResizeTo 325, 140
        Window.MoveTo ((Screen.Width - 325) / 2), ((Screen.Height - 140) / 2)
        Text.InnerHTML = "Bis zum 18.04.2011 13:49:02 sind es noch:<p>"  
        Call RefreshTime
        iTimerID = Window.setInterval("RefreshTime", 100)  
    End Sub

    Sub RefreshTime()
        D = CDate("18.04.2011 13:49:02") - Now  

        With document.all
            .Tag.Value = Right("     " & Int(D), 6)  
            .Std.Value = "   " & Right("0" & Hour(D), 2)  
            .Min.Value = "   " & Right("0" & Minute(D), 2)  
            .Sek.Value = "   " & Right("0" & Second(D), 2)  
        End With
    End Sub
</SCRIPT>

<body bgcolor='buttonface' style='font-family:Arial;font-size:12px'><span id = "Text"></span>  
<table border='0' style='font-family:Arial;font-size:12px'>  
<tr>
<td><input type='text' name='Tag' value='' readonly='readonly' size='1' style='font-family:Arial;font-size:12px'></td>  
<td>Tage&nbsp;&nbsp;</td>
<td><input type='text' name='Std' value='' readonly='readonly' size='1' style='font-family:Arial;font-size:12px'></td>  
<td>Std&nbsp;&nbsp;</td>
<td><input type='text' name='Min' value='' readonly='readonly' size='1' style='font-family:Arial;font-size:12px'></td>  
<td>Min&nbsp;&nbsp;</td>
<td><input type='text' name='Sek' value='' readonly='readonly' size='1' style='font-family:Arial;font-size:12px'></td>  
<td>Sek&nbsp;&nbsp;</td>
</tr>
</table>
</body></html>

Gruß Dieter
Mitglied: jeb-the-batcher
jeb-the-batcher 17.01.2011 um 10:49:25 Uhr
Goto Top
Zitat von @rubberman:
Richtig. Aber diese Form führt dazu, dass der Cursor immer am Zeilenanfang steht, was bei langsamen Schleifen (wie die vom
TO) dazu führt, dass er dort sichtbar wird. In meinen Augen auch nicht schöner face-sad

Hallo rubbermann,

auch kein Problem, dann muss man nur die Zeile umstellen, dann steht der cursor auch am Ende
<nul set /p ".=.!del!!cr!!output:~0,40!"  

Grüße
jeb
Mitglied: Power-Poler
Power-Poler 17.01.2011 um 18:36:54 Uhr
Goto Top
Guten Abend
Dieter, das sieht ja richtig nice aus.
Was ist das? html, kenne die Endung hta nicht, aber laut Windows ist es irgendwas mit MS HTML Anwendungshost
Sieht Richtig gut aus.
Danke

Wegen des anderen, würde mich immer noch gerne damit beschäftigen, aber habe diese Woche leider relativ wenig zeit.
Zum Wochenende erst wider.
Schon alleine finde ich alle Sachen, die man mit Windows Bordmitteln machen kann ziemlich interessant.
Und nur um mal etwas in Richtung Programmieren zu gehen, würde ich mich da durch quälen.

Danke Leute für eure Unterstützung, Richtig toll hier das Forum. face-smile
Mitglied: rubberman
rubberman 17.01.2011 um 18:40:51 Uhr
Goto Top
Hallo jeb,

das ist natürlich eine Idee (an DEL hatte ich nicht gedacht).
Im ganzen Satz Batch face-wink
@echo off &setlocal enabledelayedexpansion

set "Bis=18.04.2011 13:49:02"  

:: CR erzeugen
for /f %%a in ('copy /z "%~f0" nul') do set "cr=%%a"  

: DEL erzeugen
for /f "delims=#" %%a in ('"prompt #$H# &echo on &for %%b in (1) do rem"') do set "del=%%a"  

:: VBScript erzeugen
set G=%temp%\GetTimeDiff.vbs 
>%G% echo D=CDate(WScript.Arguments(0))-Now:WScript.Echo Int(D)^&" "^&Hour(D)^&" "^&Minute(D)^&" "^&Second(D)  

:Test
:: VBScript aufrufen
for /f "tokens=1-4" %%a in ('cscript //nologo "%G%" "%Bis%"') do set "output=%%a Tage %%b Stunden %%c Minuten %%d Sekunden     "  
:: neue Ausgabe schreiben
<nul set /p ".=.!del!!cr!%output:~,45%"  
goto Test

Grüße
rubberman
Mitglied: 76109
76109 17.01.2011 um 19:34:59 Uhr
Goto Top
Hallo Power-Poler!

HTA ist in vielen Dingen ganz nützlich und bietet in Verbindung mit VBS sehr viele Möglichkeiten.

Kurzbeschreibung:
Das Akronym HTA steht für HTMLApplication (HTML Anwendung). Es ist eine von Microsoft geschaffene Plattform für das Schreiben von Anwendungen die auf den normalen Standards von Internetseiten funktionieren (HTML, CSS, JavaScript, DOM...). Zusätzlich unterstüzt diese weitere Funktionen, die in normalen Web-Dokumenten nicht enthalten sind/sein können. HTA erstellt dabei eine selbstlaufende Anwendung die, ähnlich bei normalen Programmen, ausgeführt und verarbeitet werden kann.

Weitere Info's z.B. hier:
http://www.html-world.de/program/hta_ov.php
http://de.wikipedia.org/wiki/HTML-Applikation

Gruß Dieter