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


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







All Articles