我想为' set / p"" ='创建一个计时器。命令,这样如果你没有在所需的时间空间输入内容,它就会移动到另一个标签。
例如
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
是否可以命令程序在设置/ p'之前设置3秒计时器?不将它与C#等其他语言混合使用?
答案 0 :(得分:4)
我在this post接听了答案,稍加修改后才能完成此请求。
@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's 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's 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
答案 1 :(得分:2)
Squashman的建议也是我想到的最好的建议。保存以下.bat脚本并运行它,看看它是否提供了您的用户体验。
@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