Pause命令在Enter键和Escape键上退出,但不会返回不同的ErrorLevel
按Enter键或Escape键时,Choice命令不会返回。
为了检测ENTER,您可以使用XCOPY,真的
但是,用纯批次检测单个ESC似乎是不可能的。
setlocal EnableDelayedExpansion
call :GetKey
if "!key!"=="" echo ENTER
if "!key!"==" " echo SPACE
exit /b
:GetKey
set "key="
for /F "usebackq delims=" %%L in (`xcopy /L /w "%~f0" "%~f0" 2^>NUL`) do (
if not defined key set "key=%%L"
)
set "key=%key:~-1%"
exit /b
这是有效的,因为xcopy /L /W
要求按键开始复制,然后它显示按键并结束。
您可以使用choose32.exe执行此操作(http://www.westmesatech.com/editv.html):
choose32 -c ^A^[ -d ^A -q -n -p "ESC to quit, ENTER to continue: "
^A是Ctrl+A(ASCII字符1),^[是Ctrl+[(ASCII字符27或Esc)。命令行分解:
- -c指定哪些击键是有效的(在本例中为Ctrl+A和Esc)
- -d告诉如果按下回车键要使用哪个选项("默认"选项)
- -n隐藏选项列表
- -q不显示所按下的键击
- -p指定要显示的提示
在这种情况下,如果按Esc键,choose32将返回2的退出代码;如果按Enter键,choose 32将返回1的退出代码。
我觉得这个问题很有趣,想添加另一个可能的解决方案,powershell ReadKey
命令
PowerShell Exit($host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown').VirtualKeyCode);
用法
@echo off
set /p "=> Single Key Prompt? " <nul
PowerShell Exit($host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown').VirtualKeyCode);
echo KeyCode = %ErrorLevel%
输出:输入键
> Single Key Prompt?
KeyCode = 13
输出:退出键
> Single Key Prompt? KeyCode = 27
参考
之后就会在
PS暂停替代