Can I create a command "set / p" "=" with a timer in Cmd?
I want to create a timer for the "set / p" "=" command so that if you don't enter something in the desired temporary space it will move to a different label.
Eg.
echo You have 3 seconds to type 'go'
(??if not typed in 3 seconds goto fail??)
set /p input=
if %input%==go goto win
goto fail
Can a program be programmed to set a 3 second timer before "set / p"? Without mixing it with another language like C # etc.
+1
source to share
2 answers
Squashman's suggestion is the best that comes to my mind. Save the following .bat script and run it, and see if it offers the user experience you had in mind.
@echo off
setlocal
set /P "=You have 3 seconds to type 'go': "<NUL
rem // capture an extended character as a default option for "choice"
for /f %%I in ('forfiles /p "." /m "%~nx0" /c "cmd /c echo 0x99"') do set "char=%%~I"
rem // for each letter in "go"...
for %%I in (g o) do (
choice /c %%I%char% /t 3 /d %char% >NUL
rem // Extended character probably isn't on the keyboard.
rem // If the result was the extended char, it was timed out.
if errorlevel 2 goto fail
rem // visual response of user input w/o new line
set /P "=%%I"<NUL
)
echo;
echo You did it!
pause & goto :EOF
:fail
echo;
echo Too slow.
pause
+2
source to share
I replied to this post and modified it a bit to accommodate this request.
@echo off
setlocal EnableDelayedExpansion
rem Execute a SET /P command with time out
rem Antonio Perez Ayala
rem If this file is re-executed as pipe right side, go to it
if "%~1" equ "TimeoutMonitor" goto %1
del InputLine.txt 2> NUL
(
set /P "input=You have 3 seconds to type 'go': " > CON
> InputLine.txt call set /P "=%%input%%" < NUL
) 2> NUL | "%~F0" TimeoutMonitor 3
set /P "input=" < InputLine.txt
del InputLine.txt
if /I "%input%" equ "go" (
echo You did it^^!
) else (
echo you failed...
)
goto :EOF
:TimeoutMonitor
rem Get the PID of pipe left side
tasklist /FI "IMAGENAME eq cmd.exe" /FO TABLE /NH > tasklist.txt
for /F "tokens=2" %%a in (tasklist.txt) do (
set "leftSidePipePID=!lastButOnePID!"
set "lastButOnePID=%%a"
)
del tasklist.txt
rem Wait for the input line, or until the number of seconds passed
for /L %%i in (1,1,%2) do (
ping -n 2 localhost > NUL
if exist InputLine.txt exit /B
)
rem Timed out: kill the SET /P process and create a standard input line
taskkill /PID %leftSidePipePID% /F > NUL
echo/
echo Timed Out> InputLine.txt
exit /B
+4
source to share