pbelcl
Goto Top

Choice länger warten als 99 Sekunden?

Kann man bei Choice eine längere Wartezeit angeben als 99 Sekunden?

Hi Leute,

Ich habe mir mit CHoice eine Auswahlfrage geschrieben:

%utildir%\choice /cjn /t:n,600 j=ja oder n=nein   
if errorlevel 2 goto Meldung
if errorlevel 1 goto OK

Leider geht der Choice Befehl immer schon nach 60 Sekunden weiter!
Ich vermute dass Choice nur zweistellige Zahlen mit dem /t Parameter verarbeiten kann.

Ich brauche aber in meinem Script eine Zeitspanne von ca. 10 Minuten!

Kann mir jemand einen Tipp geben, ob das mit Choice überhaupt geht?
Oder gibt es vielleicht andere Programme die Eingaben in einem Batch zulassen??

Content-Key: 118581

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

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: Destry
Destry 19.06.2009 um 14:57:11 Uhr
Goto Top
Hallo pbelcl,

mit "set /p" kannst Du Eingaben vom Nutzer abfragen.
Das Programm "sleep" kann für Pausen sorgen die länger als 10 Minuten sind.

Gruß,
Destry
Mitglied: 76109
76109 19.06.2009 um 15:19:48 Uhr
Goto Top
Hallo pbelcl!

Eine andere Alternative zudem, was "Destry" bereits genannt hat, währe das hier:

Speichere diesen Quelltext z.B. unter wait.vbs
if wscript.arguments.count > 0 Then t=wscript.arguments(0): if isnumeric(t) then wscript.sleep t * 1000

Füge in Deiner Batch diesen Befehl mit Angabe der Zeit in Sekunden ein
@cscript //nologo wait.vbs 600

Gruß Dieter
Mitglied: bastla
bastla 19.06.2009 um 15:53:09 Uhr
Goto Top
... wobei pbelcl vielleicht eher an etwas in der Art gedacht haben dürfte:
@echo off & setlocal
Set Sek=600
Set Text="Entscheide Dich!"  

set F=%temp%\Frage.vbs
>%F% echo WScript.Echo WScript.CreateObject("WScript.Shell").PopUp(%Text%,%Sek%,,4)  

for /f %%i in ('cscript //nologo %F%') do set "Antwort=%%i"  
if %Antwort%==6 goto :OK
if %Antwort%==-1 echo Keine Antwort ist auch eine Antwort. & goto :eof
echo Na gut, dann nicht ...
goto :eof

:OK
echo OK
Grüße
bastla
Mitglied: 76109
76109 19.06.2009 um 16:43:19 Uhr
Goto Top
Hallo bastla!

Zitat von @bastla:
... wobei pbelcl vielleicht eher an etwas in der Art gedacht haben dürfte:
Hmh, das könnte gut seinface-smile

Gruß Dieter
Mitglied: pbelcl
pbelcl 19.06.2009 um 21:04:46 Uhr
Goto Top
Hallo bastla,

Ich habe Dein Script ausprobiert, und muss sagen, toll.
Du bringst mich immer wieder dazu zu überlegen ob ich nicht doch meine bescheidenen batch Kentnisse in ein wenig scripting Host Kenntnisse erweitern sollte face-wink

Denn das unten angeführte Batch soll mich eine wählbare Zeitspanne lang erinnern meine Tabletten zu nehmen und nach ca. 10-30 Minuten wenn niemand reagiert ein Email verschicken, welches ich dann als SMS bekomme.

@echo off
cls
echo "Bitte Pulver nehmen"  
echo " Zeit 10 Minuten,sonst wird ein Erinnerungsmail verschickt"  

%utildir%\choice /cjn /t:n,99 j=ja oder n=nein   
if errorlevel 2 goto Meldung
if errorlevel 1 goto OK


:OK
echo Pulver eingenommen >>%~n0.log
goto end

:Meldung
echo ! ! ! ! ! Pulver NICHT eingenommen, Email zur Warnung verschickt!!! >>%~n0.log
%utildir%\gbmail -to mailadresse@domain.com -h smtp.domain.com -from pulver@domain.at -s "Pulver nicht genommen"  
goto end

:end

Die Probleme die ich habe sind:

1.) die 99 Sekunden Bschränkung bei Choice
2.) das DOS Fenster meines batchbleibt nach dem Start im Hintergrund. Ich würde eine Möglichkeit suchen, dass das Fenster mit der "echo "Bitte Pulver nehmen" alle 1-2 Minuten in den Vordergrund kommt um so etwas zu nerven.
3.) Ich muss natürlich ins LOG FIle schreiben, ob und wann ich die Pulver genommen hab ...

Gibt es da eine einfache Möglichkeit mit scripting Host, die nicht zu viel programmieraufwand ist?
Ich denke dass es mit scripting Host Bordmitteln ein 3-4 Zeiler wird, das zu machen, oder??
Wenn das wahr ist brauch ich eigenlich die Batch Datei nimmer face-wink

Welche Literatur würdest Du mir empfehlen, wenn ich wirklich anfangen möchte etwas zu scripten?
Gibt's da was für Einsteiger, behinnend mit "hello World" oder so ??
Mitglied: pbelcl
pbelcl 19.06.2009 um 21:11:40 Uhr
Goto Top
Zitat von @76109:
Füge in Deiner Batch diesen Befehl mit Angabe der Zeit in
Sekunden ein
> @cscript //nologo wait.vbs 600
> 
Danke DIeter für diesen Tipp. Ich habs nicht genau angesehen, aber so wie es aussieht kann man während der Wartezeit NICHT JA oder NEIN tippen. Wenn das stimmt dann ist das nicht optimal, denn ich muss ja während dieser Zeit die Möglichkeit haben Ja oder NEIN zu wählen.

Ich habe mein KOMPLETTES Batch gepostet dann ist es nicht so aus dem Zusammenhang gerissen face-wink
Mitglied: pbelcl
pbelcl 19.06.2009 um 21:12:54 Uhr
Goto Top
@Destry
Danke für diesen Tipp, das mit SET /p hab ich nicht gewußt!
Werd ich ausprobieren ob mir das hilft ....
Mitglied: 76109
76109 19.06.2009 um 21:34:24 Uhr
Goto Top
Hallo pbelcl!

Zitat von @pbelcl:
aber so wie es aussieht kann man während der Wartezeit NICHT JA oder NEIN tippen
Nein, das habe ich im Gegensatz zu "bastla" nicht bedacht und daher nur ein Warten nach der Abfrage angenommen.

Gruß Dieter
Mitglied: bastla
bastla 19.06.2009 um 22:32:17 Uhr
Goto Top
Hallo pbelcl!

Als VBScript könnte das etwa so aussehen:
Intervall = 120 'Sekunden bis zur nächsten Erinnerung  
Dauer = 600 'Sekunden bis zum Versenden der Mail  
Titel = "Bitte Pulver nehmen!" 'Fenstertitel  
Sound = "sndrec32 /play /close C:\WINDOWS\Media\tada.wav" 'Pfad Sounddatei  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set Shell = CreateObject("Wscript.Shell")  
LogFile = Replace(WScript.ScriptFullName, ".vbs", ".log")  
Done = False

Do
    Shell.Run Sound, 0, True 'Soundausgabe  
    Text = "Zeit: " & Int(Dauer / 60) & " Minuten, sonst wird ein Erinnerungsmail verschickt."  
    Antwort = Shell.PopUp(Text,Intervall,Titel,4) 'Popup  
    Select Case Antwort 'PopUp-Ergebnis auswerten  
        Case vbYes 'Ja  
            fso.OpenTextFile(LogFile, 8, True).WriteLine _
                Now & vbTab & "Pulver genommen"  
            Done = True
        Case vbNo 'Nein  
            fso.OpenTextFile(LogFile, 8, True).WriteLine _
                Now & vbTab & "Pulver NICHT genommen"  
            Done = True
        Case Else 'Zeitablauf  
            Dauer = Dauer - Intervall
            If Dauer <= 0 Then 'Zeit abgelaufen, Mailversand  
                Shell.Run "C:\Utils\gbmail -to mailadresse@domain.com -h smtp.domain.com -from pulver@domain.at -s ""Pulver nicht genommen"""  
                fso.OpenTextFile(LogFile, 8, True).WriteLine _
                    Now & vbTab & "Email zur WARNUNG verschickt"  
                Done = True
            End If
    End Select
Loop Until Done
Die Pfade in den Zeilen 4 und 27 sind vermutlich noch anzupassen, und getestet habe ich nur unter XP Pro. Noch eine Anmerkung: Als Soundfile kannst Du kein ".mp3", sondern nur ".wav" verwenden.

Das Script wirst Du vermutlich per "Geplantem Task" starten; es läuft bis zur ersten Entscheidung "Ja" oder "Nein" bzw bis die in Zeile 2 angegebene Zeit in Sekunden erreicht ist.
Eine Literaturempfehlung habe ich leider nicht anzubieten, aber vielleicht findest Du unter den eingetragenen etwas Passendes (etwa gleich den zweiten)...

Grüße
bastla
Mitglied: pbelcl
pbelcl 20.06.2009 um 08:19:47 Uhr
Goto Top
Danke Bastla für Deine Hilfe!!
Werde mir das Script in den nächsten Tagen mal genauer ansehen!

Danke auch für den Tipp, hab mal kurz da reingesehen. Der 2 .Link sieht sehr interessant aus.
Mitglied: pbelcl
pbelcl 20.06.2009 um 08:20:47 Uhr
Goto Top
Zitat von @76109:
Nein, das habe ich im Gegensatz zu "bastla" nicht bedacht
und daher nur ein Warten nach der Abfrage angenommen.

Meine Frage war ja auch nicht unbedingt eindeutig definiert face-wink
Danke trotzdem für den Tipp!
Mitglied: pbelcl
pbelcl 20.06.2009 um 14:20:09 Uhr
Goto Top
Hi Bastla,

Hab Dein Script gerade ausprobiert, läuft SUPER!!!!!!!

Ist es möglich statt dem Pfad "C:\utils\..."
                Shell.Run "C:\Utils\gbmail -to mailadresse@domain.com -h smtp.domain.com -from pulver@domain.at -s ""Pulver nicht genommen"""  
Eine von mir erstellte Systemvariable zu verwenden?
SO:
                Shell.Run "%utildir%\gbmail -to mailadresse@domain.com -h smtp.domain.com -from pulver@domain.at -s ""Pulver nicht genommen"""  
klappt es nicht, ich vermute es wird nicht ganz so trivial sein face-wink
Mitglied: bastla
bastla 20.06.2009 um 15:57:23 Uhr
Goto Top
Hallo pbelcl!
ich vermute es wird nicht ganz so trivial sein face-wink
Halb so wild (insofern hätte ich das gleich einbauen sollen):
Shell.Run Shell.ExpandEnvironmentStrings("%utildir%") & "\gbmail -to mailadresse@domain.com -h smtp.domain.com -from pulver@domain.at -s ""Pulver nicht genommen"""
Grüße
bastla
Mitglied: pbelcl
pbelcl 26.06.2009 um 07:20:00 Uhr
Goto Top
Nachdem ich's jetzt eine Woche verwendet habe, bin ich begeistert!

Hab noch einige "behübschungen" für das Logging eingebaut. Falls es wen interessiert, hier der Code wie es jetzt bei mir im Einsatz ist:
Intervall = 900 'Sekunden bis zur nächsten Erinnerung  
Dauer = 3600 'Sekunden bis zum Versenden der Mail  
Titel = "!Pulver nehmen!" 'Fenstertitel  
Sound = "sndrec32 /play /close C:\WINDOWS\Media\BP_Pulver.wav" 'Pfad Sounddatei  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set Shell = CreateObject("Wscript.Shell")  
LogFile = Replace(WScript.ScriptFullName, ".vbs", ".log")  
Done = False

Do
    Shell.Run Sound, 0, True 'Soundausgabe  
    Text = "Zeit: " & Int(Dauer / 60) & " Minuten, um Pulver zu nehmen, sonst wird ein SMS verschickt."  
	fso.OpenTextFile(LogFile, 8, True).WriteLine _
                Now & vbTab & "Pulveranforderung angezeigt"  
    Antwort = Shell.PopUp(Text,Intervall,Titel,4) 'Popup  
    Select Case Antwort 'PopUp-Ergebnis auswerten  
        Case vbYes 'Ja  
            fso.OpenTextFile(LogFile, 8, True).WriteLine _
                Now & vbTab & "Pulver eingenommen "  
            Done = True
        Case vbNo 'Nein  
            fso.OpenTextFile(LogFile, 8, True).WriteLine _
                Now & vbTab & "Pulver NICHT genommen, NEIN ausgewählt"  
            Done = True
        Case Else 'Zeitablauf  
            Dauer = Dauer - Intervall
            If Dauer <= 0 Then 'Zeit abgelaufen, Mailversand  
                Shell.Run Shell.ExpandEnvironmentStrings("%utildir%") & "\gbmail -to <Mailadresse> -h smtp.domain.at -from pulver@domain.ata -s ""SMS - Pulver nicht genommen"""  
                fso.OpenTextFile(LogFile, 8, True).WriteLine _
                    Now & vbTab & "Pulveranforderung wurde ignoriert, SMS zur WARNUNG verschickt"  
                Done = True
            End If
    End Select
Loop Until Done
	fso.OpenTextFile(LogFile, 8, True).WriteLine _
               	Now & vbTab & "-----------------------------------------------"  
Vielen Dank euch allen für die TIpps, besonders bastla, Du hast es echt drauf !