okidoki
Goto Top

Batch Timeout in msgbox anzeigen?

Guten Abend,
vielleicht ist dies wieder einmal eine Frage, die viele andere interessiert ...

Ich möchte gerne einen timeout im batch abbilden und das Ganze in einer msgbox anzeigen lassen.
Dazu habe ich eine Angabe in einer msgbox und anschließend eine ping-Wartepause. Allerdings bringe ich es nicht zustande, die Wartezeit als Countdown in der msgbox abzubilden:

ECHO msgbox"Ihre Wartezeit beträgt 20 Sekunden.",64,"Timer" > %temp%\msg.vbs  
%temp%\msg.vbs
del %temp%\msg.vbs

ping /n 20 localhost >nul

GOTO EOF

Kann hier jemand helfen?
OKIDOKI

Content-ID: 180907

Url: https://administrator.de/forum/batch-timeout-in-msgbox-anzeigen-180907.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

bastla
bastla 22.02.2012, aktualisiert am 18.10.2012 um 18:50:06 Uhr
Goto Top
Hallo OKIDOKI!

Kannst Du vielleicht etwas weiter ausholen und erklären, was Du eigentlich erreichen willst? Ev könntest Du (wie in diesem Beitrag gezeigt) in einer Schleife mit jeweils einer Sekunde Dauer ein Popup anzeigen lassen (wobei dieses allerdings durch Klick auf eine Schaltfläche oder Schließen des Fensters vorzeitig beendet werden kann) - schön ist das dann aber sicher nicht ...

Grüße
bastla
OKIDOKI
OKIDOKI 22.02.2012 um 23:49:32 Uhr
Goto Top
Hallo bastla,

damit man sieht, wie lange auf etwas gewartet werden soll, soll die Wartezeit als Countdown in der msgbox angezeigt werden. Dass man den Vorgang mit klicken abbrechen kann ist klar, die Wartezeit bleibt (im Fall von ping) aber totzdem erhalten!
Siehe ähnlich diesem Beitrag:
http://board.gulli.com/thread/1342784-batch-animationen-und-zaehler/
Allerdings wird hier die Animation im Dosfenster angezeigt.

Biber hatte auch schon einen schönen Ansatz:
Batch Eine Abfrage in einer bestimmten Zeit
Als Ergänzung wäre es nun toll, den Countdown in der msgbox anzeigen zu können ...

Vielleicht hilft hier eine popup box, die aber auch nicht den Countdown an sich anzeigt, aber zumindest so lange wartet: (Quelle: http://ss64.com/vb/popup.html)

Set WshShell = Wscript.CreateObject("Wscript.Shell")  
WshShell.Popup "Click me Quick!",, "My Popup Dialogue box"  

Wie es aussehen könnte http://vbnet.mvps.org/index.html?code/hooks/messageboxhooktimer.htm


Gruß OKIDOKI
bastla
bastla 22.02.2012 um 23:58:48 Uhr
Goto Top
Hallo OKIDOKI!

Mit "Popup" wärst Du dann bei meinem Vorschlag von oben angekommen ... face-wink

Auf Deine beschriebene Situation angepasst sähe das etwa so aus:
set /a Sek=20
set PopUp=%temp%\msg.vbs
>%PopUp% ECHO WScript.CreateObject("WScript.Shell").PopUp "Ihre Wartezeit beträgt %Sek% Sekunden.",%Sek%,"Timer",64  
start %PopUp%

set /a Sek+=1
ping /n %Sek% localhost >nul
del %PopUp%
Grüße
bastla
Skyemugen
Skyemugen 23.02.2012 um 07:07:58 Uhr
Goto Top
Aloha,

warum wird nicht einfach die timeout.exe genutzt (bei Windows 7 standard - sonst gibt es auch eine gleichfunktionierende im Internet (einzeln als zip), vom Resource Kit für NT4, nutze ich für unsere fehlerhafte OpenVPN-Verbindungen)
>timeout /?

TIMEOUT - This utility is similar to the DOS PAUSE command.  However, it
          accepts a timeout parameter to specify a length of wait (in seconds)
          at which time it will continue without a key press.

          Written by Eric Brown, Business System Division.
          Copyright (C) Microsoft Corporation, 1992-1995.

Usage -   TIMEOUT <###>
          where <###> is a decimal number of seconds between -1 and 100000.
          The value -1 means to wait indefinitely for a key hit.


23.02.2012  7:05:52,90 C:\Dokumente und Einstellungen\User
>timeout 20

Waiting 16 seconds, press a key to continue...
da zählt natürlich von 20 runter face-wink [Auszug aus der angepassten timeout.exe, die auch für Windows XP / x86 funktioniert]

Also nur für den Fall, dass man eine Anzeige benötigt und daher auf VBS MsgBox rumkaut, weil man glaubt, im Batch gibt es keine.

greetz André
bastla
bastla 23.02.2012 um 08:55:32 Uhr
Goto Top
@skye
Wenn ich das richtig verstanden habe, geht es aber darum, die Verzögerung (realisiert durch "ping") in voller Länge sicherzustellen - die Anzeige soll nur informativen Charakter haben (deswegen auch per "start" parallel ausgeführt) - im gleichen Fenster wird das aber auch mit "/b" nix werden ...

Grüße
bastla
Skyemugen
Skyemugen 23.02.2012 um 09:05:59 Uhr
Goto Top
Aloha bastla,

verstehe ... also das übliche bei OKIDOKI, man darf wieder mitinterpretieren, weil er es nicht ordentlich ausdrückt. ...

start cmd /c timeout 20 & ping /n 20 localhost >nul

dasselbe in grün, wobei 1 Sekunde Differenz sein wird (witzigerweise ist der Ping bei mir eher fertig, timeout also auf 19 oder ping auf 21 setzen).

greetz André
OKIDOKI
OKIDOKI 23.02.2012 um 12:04:09 Uhr
Goto Top
Aloha,

bastla hat recht mit seiner Version, womit ich am Anfang wäre!
André kann ich auch nicht widersprechen, d´rum hier noch einmal deutlich face-wink

Ich suche nach einer Möglichkeit, die verbleibende Zeit im Popup abzubilden: Sie warten noch 7, 6, 5, ... Sek. Bisher wurde man ja nur darauf hingewiesen, wie lange man warten muss, oder dass man schon so und so lange gewartet hat!

Ich hoffe diesmal deutlicher ... face-wink
OKIDOKI
pieh-ejdsch
pieh-ejdsch 23.02.2012 um 17:09:43 Uhr
Goto Top
moin OKIDOKI,

Wenn Du eh mit (temporären) VBS arbeitest, kannst Du doch auch wait mit vbs nutzen. ist vllt etwas genauer als der ping.

sonst würde ich auch nur ein kleineres cmd popup verwenden
in Windows 7 aber mit waitfor anstatt timeout. Waitfor zieht die Zeit bis zum Ende durch.

start "Timer" cmd /c "color f0&mode con cols=35 lines=4& for /l %%i in (20 -1 1) do cls&title Wartezeit ist noch %%i sek.&echo Sie warten noch %%i sekunde^(n^).&waitfor x /t 1"  

Gruß Phil
bastla
bastla 23.02.2012 um 18:25:04 Uhr
Goto Top
Hallo OKIDOKI!
Ich suche nach einer Möglichkeit, die verbleibende Zeit im Popup abzubilden
Du wirst sie leider nicht finden ...

... und etwas in der Art
set /a Sek=20
set PopUp=%temp%\msg.vbs
>%PopUp% ECHO T=(Timer+1) Mod 86400:WScript.CreateObject("WScript.Shell").PopUp "Ihre Wartezeit beträgt " ^& WScript.Arguments(0) ^& " Sekunden.",1,"Timer",0:Do While Timer^<T:Loop  
for /l %%i in (%Sek% -1 1) do %PopUp% %%i
wirst Du sicherlich auch niemandem antun wollen ... face-wink

Grüße
bastla
rubberman
rubberman 24.02.2012 um 00:23:39 Uhr
Goto Top
Hallo OKIDOKI,

wie bereits in deinem letzten Thread angemerkt, ist Batch nun mal Console und nicht Klicki-Bunti.
Hier noch mal ein Beispiel, an dem du unschwer erkennen kannst, dass du den ganzen Kram auch gleich in einer anderen Sprache umsetzen könntest ...

@echo off &setlocal
:: Variable Sek wird in der HTA wieder expandiert
set /a Sek = 5

set "msg=%temp%\tmp.hta"  
:: alle Zeilen, die mit min. 6 Leerzeichen anfangen in die HTA umleiten
>"%msg%" (type "%~f0"|findstr /bc:"      ")  
mshta "%msg%"  
del "%msg%"  

echo Jetzt gehts weiter.
pause
goto :eof
:: und schon Schluss mit Batch

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd">  
      <html xmlns="http://www.w3.org/1999/xhtml">  
        <head>
          <title>Countdown</title>

          <hta:application
           id="oHTA"  
           applicationname="myApp"  
           border="thin"  
           borderstyle="normal"  
           caption="yes"  
           contextmenu="yes"  
           icon=""  
           innerborder="no"  
           maximizebutton="no"  
           minimizebutton="no"  
           navigable="yes"  
           scroll="no"  
           scrollflat="no"  
           selection="no"  
           showintaskbar="no"  
           singleinstance="yes"  
           sysmenu="yes"  
           version="1.0"  
           windowstate="normal"  
          />

          <style type="text/css">  
            body      {background-color:#EEF0FF; color:#FF0000; font-family:Helvetica; font-size:12pt; margin:10px 20px 10px 20px;}
          </style>

          <script type="text/jscript">  
            /* <![CDATA[ */
            window.resizeTo(300, 100);
            window.moveTo(screen.width/2-150, screen.height/2-50);
            var oWSH=new ActiveXObject("WScript.Shell");  
            var i=parseInt(oWSH.ExpandEnvironmentStrings("%Sek%"));  

            function countdown() {
              if (0 < i) {
                document.getElementById('display').innerHTML='Ihre Wartezeit beträgt '+i.toString()+' Sekunden.'  
                i--;
                setTimeout('countdown()', 1000);  
              } else {
                window.close();
              }
            }
            /* ]]> */
          </script>

        </head>
        <body onload="countdown()">  
          <div id="display" name="display" />  
        </body>
      </html>
... denk mal drüber nach ...

Grüße
rubberman
OKIDOKI
OKIDOKI 24.02.2012 um 08:31:00 Uhr
Goto Top
Guten Morgen,

ja, da kann ich bastla nur recht geben face-wink
Auch Rubbermann stimme ich natürlich zu, hier sind die Grenzen der Console erreicht! Mein Problem, da bin ich ganz ehrlich, sind kleine Wünsche, die dauernd hinzugekommen sind. Ich denke schon länger darüber nach, noch einmal ganz neu aufzusetzen!
Hast du vielleicht einen Tipp, wie ich einsteigen sollte? Was hälst du von purebasic? http://www.purebasic.com

Ansonsten trotzdem noch einmal danke für eure Mühe!
OKIDOKI
Skyemugen
Skyemugen 24.02.2012 um 08:50:27 Uhr
Goto Top
Zitat von @pieh-ejdsch:
in Windows 7 aber mit waitfor anstatt timeout. Waitfor zieht die Zeit bis zum Ende durch.
Aloha Phil,

danke für den Hinweis waitfor gibt es ja ebenso im o.g. Resource Kit für Windows 2000
>waitfor /?
waitfor:

waitfor [-t <timeout>] [-s] <signal name>
Wait until the 'signal' is given across the net.
Parameters:
        -t timeout      Number of seconds to wait.  Default is forever.
        -s              Send signal instead of waiting.

Only one 'waitfor' can wait on a given signal on a given machine.
ergo auch für XP nutzbar etc. schöne Sache, sollte mir mal alle tools im Kit durchlesen, wer weiß, was noch so gutes dabei ist ^__^

greetz André
rubberman
rubberman 24.02.2012 um 14:56:19 Uhr
Goto Top
Hallo OKIDOKI.

Zitat von @OKIDOKI:
Hast du vielleicht einen Tipp, wie ich einsteigen sollte? Was hälst du von purebasic?

Du solltest die Sprache nach folgenden Gesichtspunkten auswählen:
- Was will ich zukünftig damit Programmieren? Welche Sprache ist dafür geeignet?
- Welche Syntax fällt mir am leichtesten zu verstehen?
- Ist die Sprache populär (ein Indiz dafür dass sie auch gut sein könnte face-wink) und wird sie noch weiterentwickelt.

Schau dir mal Java, C# und C++ an. Falls dir die Syntax widerstrebt und du nur für Windows entwickeln willst ggf. auch VB. Als Einsteigersprache evtl. Python.
Es ist schwierig dir einen Rat zugeben. Wenn du 10 Leute fragst, wirst du wahrscheinlich 11 unterschiedliche Antworten bekommen face-wink. Ich habe mich vor etwas über einem Jahr dazu entschieden mir C++ autodidaktisch anzueignen. Leider habe ich nur wenig Zeit dazu und somit ist mein Code meistens ein hässlicher Mix aus C, C++ und C++/Cli ...

Grüße
rubberman
OKIDOKI
OKIDOKI 24.02.2012 um 15:13:55 Uhr
Goto Top
Hallo rubberman,

das ist ein guter Tipp! Python habe ich auch schon einmal gehört, das würde meinen Befürfnissen, glaube ich, nahe kommen. Ich werde es mal ausprobieren! Gibt es dazu auch ein gutes Forum?

Grüße OKIDOKI
rubberman
rubberman 24.02.2012 um 19:23:21 Uhr
Goto Top
Hallo OKIDOKI,

ich habe selbst noch nichts mit Python gemacht, nur ab und zu einige Codes studiert. Für mich überzeugt aber die Plattformunabhängigkeit und die große Anwendungsbreite. Außerdem ist das Einrücken des Codes Teil der Syntax, was meiner Meinung nach nicht unerheblich ist, um einen guten Programmierstil zu schulen. Foren gibt es sicherlich einige, ich würde aber auch nur eine Suchmaschine benutzen - darum kein Vorschlag von mir.

So, nun sind wir aber eindeutig offtopic - egal, wenn's dir hilft face-wink

Grüße
rubberman
OKIDOKI
OKIDOKI 24.02.2012 um 19:52:55 Uhr
Goto Top
Hallo rubberman,
ja, danke, hilft mir wirklich und vielleicht auch anderen!

Zum guten Abschluss dieses Threads gehört auch ein Vorschlag, mit dem womöglich auch andere gut leben können. Wie gesagt ging es darum, einen Countdown in der msgbox abzubilden. Das dies nicht ohne Probleme möglich ist, haben rubberman, bastla, Skyemugen und pieh-ejdsch wieder einmal eindrucksvoll bewiesen. Eine zufriedenstellende Lösung ist nicht in Sicht.

Hier mein Vorschlag noch, den ich beim Surfen gefunden habe:
"Wbusy ist ein Busy-Anzeiger für zeitaufwändige Batch-Prozesse. Das Busy-Fenster zeigt einen Zähler order Laufbalken und eine Textinformation.
Um das Fenster zu schließen oder um es durch eine "fertig" Mitteilung zu ersetzen, wird das Programm noch einmal mit dem /stop Parameter gestartet.

Im /stop Modus wird die Textinformation mit einem OK-Button ausgegeben (optional: timeout).
Wird kein Text angegeben, verschwindet der Busy-Anzeiger einfach.
Der Titel muss in beiden Fällen der gleiche sein.

Mehrzeiliger Text möglich. Automatische Fensteranpassung." Quelle: http://www.horstmuc.de/w32diald.htm#wbusy
Klappt soweit ich probiert habe hervorragend!

Danke allen
OKIDOKI
bastla
bastla 24.02.2012 um 20:22:11 Uhr
Goto Top
Hallo OKIDOKI!

Danke für Deinen Lösungsansatz/Link face-smile ...

... aber hinsichtlich rubbermans (mit Bordmitteln umsetzbarer) HTA-Variante kann ich die Aussage
Eine zufriedenstellende Lösung ist nicht in Sicht.
eigentlich nicht akzeptieren (obwohl natürlich "zufriedenstellend" vom Anspruchsniveau abhängt face-wink) ...

Grüße
bastla
OKIDOKI
OKIDOKI 24.02.2012 um 20:36:31 Uhr
Goto Top
Hallo bastla,
ja, das stimmt, so gesehen.

Aber bei rubbermans Vorschlag müsste noch ergänzt werden, dass durch Abbruch des Countdowns der Countdown trotzdem weiterzählt! So wäre es so, dass man auf Schließen klickt und die batch damit auch gleich zur nächsten Sprungmarke springt - ohne den Countdown abzuwarten.
Ansonsten sieht der Countdown echt hammermäßig aus - finde ich! (Wenn das mit dem zu verhindernden Abbruch irgendwie gehen würde, wäre es sogar besser als mit Wbusy, weil man dann weiß, wie lange man noch wirklich warten muss!

Gruß OKIDOKI
bastla
bastla 24.02.2012 um 21:17:36 Uhr
Goto Top
Hallo OKIDOKI!
Wenn das mit dem zu verhindernden Abbruch irgendwie gehen würde
Auf die Schnelle könntest Du Zeile 38 auf:
sysmenu="no"
ändern - ist damit zwar noch nicht wasserdicht, aber sicher besser ...

Grüße
bastla
rubberman
rubberman 24.02.2012 um 21:39:33 Uhr
Goto Top
Hallo bastla.

Zitat von @bastla:
Auf die Schnelle könntest Du Zeile 38 auf:
sysmenu="no"
ändern
Genau das war der Grund, warum ich alle mir bekannten Attribute des hta:application - Tags mit aufgenommen habe face-wink

Zitat von @bastla:
ist damit zwar noch nicht wasserdicht
Och, ich bin davon überzeugt, dass wbusy genauso wenig wasserdicht ist.

Grüße
rubberman
OKIDOKI
OKIDOKI 24.02.2012 um 21:46:31 Uhr
Goto Top
Ihr seid echt scharf face-wink

Unabhängigvon der Wirkung bei Wbusy, ist rubbermans countdown einfach besser und sieht viiiiel besser aus!!! War ja auch nur ein Vorschlag ...

OKIDOKI