Batch Abfrage nach Zeit beenden?

3 Antworten

Basierend auf einem etwas verunglückten Script das ich auf @DeiDei2303 's Fundsache kritisch kommentiert hatte.
Habe ich die Sache etwas ausgebaut. Warum sollte ich das Rad ein zweites mal erfinden?
Die Abfrage erfolgt in einem zweiten Fenster da...

Taskkill /f /fi "Windowtitle eq %WindowName%"

nur anhand des Fensternamens erkennen kann welche Instanz von cmd.exe "abgeschossen" werden soll.

Es wäre zwar durchaus möglich beide Insanzen in einem Fenster auszuführen, dann müsste ich jedoch über das WMI und verwendete kommandozeile der Abfrage die richtige Instanz selektieren was einigermaßen umständlich ist.
WMI-Kram gehört auch nicht unbedingt in die Hände von Anfängern....

so nun die Batch:

@echo off
setlocal enabledelayedexpansion
if "%1" NEQ "" goto %1
set "self=%0"


  rem  Hauptprogramm
echo  irgendwas
set  "punke=3"
set /a eins=%punkte%100+1
set /a zwei=%random% %% %eins%
set /a drei=%random% %% %eins%
set /a vier=%zwei%+ %drei%

  rem Abfrage  Name der RückgabeVariable   Timeout in sekunden    "Fragetext"
call :Abfrage fuenf 7  "Was ist das Ergebnis von %zwei%+%drei% ?"

if [%fuenf%]==[] (echo kein Ergebnis) else (echo die Eingabe war %fuenf%)
pause
exit /b 
  rem  Hauptprogramm Ende


:secondThread
echo In %_timeout% sekunden  schliesst dieses fenster!
echo:
set /p "var=%fragetext% : "
echo %var% > input.tmp 
exit /b

:Abfrage 
  rem parameters:  %1=Outputvariable  %2=Timeout  %3=Fragetext
  rem Name  für  das Abfragefenster wichtig! Sollte einigermaßen Markant sein!
set "WindowName=Ergebnisabfrage"
  rem Zeit bis  zum schließen der Abfrage
set "_timeout=%~2"
del /q /f "input.tmp" 2>nul 
set "fragetext=%3" 
start  "%WindowName%" cmd /c %self% :secondThread 

set "n=0"
:loop
set /a n+=1
timeout 1 > nul
if !n! LSS %~2 (
    if not exist "input.tmp" goto :loop
     (set /p %~1= )< "input.tmp"
) else (
      rem abfragefenster schließen
    Taskkill /f /fi "Windowtitle eq %WindowName%" >nul 2>&1
    echo die Zeit ist Abgelaufen
)
del /q /f "input.tmp " 2>nul 
exit /b

was Außerhalb des Bereichs Hauptprogramm ist sollte Dich als Anfänger nicht weiter jucken funktioniert und gut...

als Äquivalent zu Deinem set /p fünf=%zwei%+%drei%= steht nun der Aufruf der Subroutine Abfrage zur Verfügung .

  • Parameter 1 ist der Name der Variable , in welcher das Ergbnis der Abfrage übergeben werden soll
  • Parameter 2 ist die zeit bis das Abfragefenster geschlossen wird
  • parameter 3 ist der Text welcher von der Abfrage Angezeigt werden soll, muss in Anführungszeichen stehen!

Was du mit dem Kram anfängst ist Dein Bier mich hat nur das Thema AbfrageTimeout interessiert....

Lass zwischen dem moduloOperator %% und einer %variable% ein Leerzeichen!

@Tim So kann man alles gewaltsam TimeOuten.... ;p

Ich habe zwar noch ne andere Idee im Sinn, aber jetzt ist für mich erstmal zeit zum Spazieren gehen... (das machen alte Leutchen so ;)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Huhngut 
Fragesteller
 21.04.2018, 10:40

Danke aber noch eine Frage,bei mir öffnet sich so ein grünes Fenster mit Hellblauer Schrift,läßt sich das ändern

0
Erzesel  21.04.2018, 11:10
@Huhngut

woher sollte sich ein grünes Fenster Öffnen ich habe jedenfalls keine

color 2b   

... irgendwo platziert.

...aber ich ahne was... hast Du irgendwann einmal die Farben in den Fenstereigenschaften von cmd verändert?

wenn du wirklich mal alle irgendwann getanen Fenstereinstellungen in die Wüste schicken möchtest, lösche in der Registry einfach den Schlüssel:

HKEY_CURRENT_USER\Console

Dann kannst Du cmd starten und rechts oben auf das Icon klicken und Standardwerte und Eigenschaften nach deine Wünschen neu einstellen.

Dieser Regsitry key dann automatisch neu erstellt

0

Man könnte das mit choice machen. ~

echo 1+1 ist:
echo a) 1
echo b) 2
echo c) 3
echo d) 4

choice /c ABCDE /N /T 10 /D E

REM gibt Index des Gewählten Zeichens in ABCDE an
echo %ERRORLEVEL%

pause
 

Aber was du wirklich suchst, findest du hier (oberste Antwort):

https://stackoverflow.com/questions/7701521/bat-game-adding-a-timer-with-set-p

Erzesel  20.04.2018, 10:22

das was Du da verlinkt hast, sieht auf den ersten Blick recht gut aus.
die erste Lösung nicht von mir! :

 @echo off
setlocal EnableDelayedExpansion
if "%1" NEQ "" goto %1

del enter.tmp 2>nul >nul
start /b cmd /c %0 :secondThread

:FirstThread
set n=0
echo Enter Text (5 seconds timeout):

:loop
set /a n+=1
ping -n 2 localhost > nul
if !n! LSS 5 (
    if not exist entER.tmp goto :loop
    < Enter.tmp (
        set /p input=
    )
    echo !input!
) ELSE (
    echo Timeout for input
)

exit /b

:secondThread
set /p var=
> enter.tmp echo !var!
exit /b

...hat den makel das beide Threads ins gleiche Fenster Ausgeben auf diese Weise merkt niemand , das der Abfrage-Thread auch nach Ablauf des Timeouts noch immer auf eine Eingabe wartet. und nie wirklich beendet wird. Deshalb bleibt auch das Fenster offen obgleich es eigentlich schließen sollte. a

Die variante mit dem C# funktioniert nur auf Systemen mit installierter dotNet-Runtime... Ich bezweifle das es das Ansinnen von jemanden der Batch schreibt ist 90MB Runtime zu installieren, nur damit die Batch funktioniert... Dann könnte man auch gleich alles in C# schreiben...:p

0

Notfalls ginge es auch, indem man die Systemzeit vor und nach der Eingabe abfragt und ggf. sagt "Die Antwort ist zwar richtig, aber du hast leider länger als 10 Sekunden für die Eingabe gebraucht."