Batch Abfrage nach Zeit beenden?
Hallo liebe Batchkundige und andere Menschen,
Ich arbeite an einem Mathe Programm.Ein kleines Beispiel:
:plus
set /a eins=%punkte%100+1
set /a zwei=%random% %%%eins%
set /a drei=%random% %%%eins%
set /a vier=%zwei%+%drei%
set /p fünf=%zwei%+%drei%=
goto start
jetzt soll man zum rechnen aber nur 10 Sekunden Zeit haben sprich nach 10 Sekunden geht die Benutzereingabe aus und er geht zu start,man soll aber ab sekunde 0-10 eintippen können.
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 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
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
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
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."
Danke aber noch eine Frage,bei mir öffnet sich so ein grünes Fenster mit Hellblauer Schrift,läßt sich das ändern