我需要我的代码循环执行子例程,直到按下某个键。我不知道该怎么做。有什么帮助吗?
您可以使用 Choice 命令的 timeout 和 default 扩展 例如:
:start
@echo off
cls
:loop1
cls
echo press 1 for option 1
echo press 2 for option 2
echo press 3 for option 3
echo press any other number key to tell the date
echo.
echo %time%
choice /t 1 /c 123456789q /d q >nul
if %errorlevel% EQU 10 goto loop1
if %errorlevel% EQU 1 goto 1
if %errorlevel% EQU 2 goto 2
if %errorlevel% EQU 3 goto 3
if %errorlevel% GEQ 4 goto end
goto loop1
:1
echo.
echo.
echo option 1
echo.
pause
exit
:2
echo.
echo.
echo option 2
echo.
pause
exit
:3
echo.
echo.
echo option 3
echo.
pause
exit
:end
echo %date%
pause
Exit
在这种情况下,Choice命令每隔 1 秒自动选择 Q 作为默认选择,因此如果用户键入 Q,它只会在循环中跳过 1 秒。但是,如果他们输入除 1、2、3 之外的任何数字键,程序都会显示日期。如果用户输入 1,程序将执行选项 1,并且执行选项 2 和 3 任何其他键都不会执行任何操作。唯一的缺点是你最多需要等待 1 秒,并且你必须为循环保留一把钥匙
或者您可以直接输入:
@echo off
color 0a
title KeyStrokeSim
goto Start
:Start
cls
echo Press D or F to continue...
choice /c df /n
if %errorlevel%==1 goto Finished
if %errorlevel%==2 goto Finished
:Finished
echo You have Pressed D or F!
pause
goto Start
迟到的答案,但不使用
choice
或SET /P
,而是使用replace
。@echo off
SETLOCAL EnableDelayedExpansion
echo Press any key...
>keystroke.txt replace ? . /u /w
FOR /F delims^=^ eol^= %%K in (
'2^>nul findstr /R "^" "keystroke.txt"'
) do set "key=%%K"
del /f /q "keystroke.txt"
echo You pressed: [!key!]
该脚本利用了
/W
的
REPLACE
选项。
编辑:现在支持
;
(默认eol
)
你可以试试这个:
@echo off
Echo. > Temp.txt
:: You require choice.exe for this
choice /c 1234567890qwertyuiopasdfghjklzxcvbnm
Echo 1 > Temp.txt
@echo off
set var=
:: Code Prior to Loop
:: Loop starts below
start /b stroke.bat
:loop
::: Loop Code Goes here
::
:: You will not be able to take user-input in loop
:: Do not tamper with "var"
:: To force exit the loop just "goto end"
:: Note if you force exit the loop you will need to exit this bat
:: and start a new window (since Stroke will be running)
::
::: End of loop
<Temp.txt set /p var=
if "%var%" NEQ "1" goto loop
:end
:: Post loop code
Exit
这应该适用于任何字符或数字,但不适用于标点符号或 Enter、空格等。
您可以将其修改为仅适用于输入,方法是将
choice
替换为 set /p
:
@echo off
Echo. > Temp.txt
set /p v=
Echo 1 > Temp.txt
您可以使用它来
enter
,如果您没有choice.exe
如果您想定义在一定时间内没有按键按下的默认操作,您可以使用如下选项来定义按键:
@Echo off
:ExampleLoop
Echo.[A] Action [B] Alternate Action
For /F "delims=" %%C in ('Choice /T 10 /N /C:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 /D B') Do (
CLS & Set "Choice=%%C" & Call :Choice[1-%%C] || (CLS & Echo. %%C is not a valid Choice)
)
Goto :ExampleLoop
:Choice[1-A]
Echo %~0
Echo Elective Command
Exit /B 0
:Choice[1-B]
ECHO %~0
Echo Default Command
Exit /B 0
上面将返回文字键而不是 ErrorLevel(注意:将返回所有大写字母)。
通过使用带有 :Label 子例程的调用,并定义所有选择选项,可以避免烦人的错误音,并通过在调用结果上使用
||
条件测试输出自定义消息。当存在多个选项时,标签方法还避免了复杂且通常混乱的条件测试的需要。
@echo off
for /f skip^=1^usebackq^ ^delims^= %%G in =;(
`3^>^&0 replace ? . /u /w`);= do set "_keystroke_1=%%~G"
BackspaceEnter
echo/1%_keystroke_1%2
for /f skip^=1^usebackq^ ^delims^= %%G in =;(
`3^>^&0 replace ? . /u /w`);= do set "_keystroke_2=%%~G"
if %_keystroke_2% equ 0 echo/%_keystroke_2%
结果:
2
0