如何在交互式Windows bat/cmd脚本(cmd.exe)中区分Enter键和Escape键



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暂停替代

最新更新