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

Batch file 如何在交互式Windows bat/cmd脚本(cmd.exe)中区分Enter键和Escape键?,batch-file,cmd,interactive,Batch File,Cmd,Interactive,暂停命令在Enter键和Escape键上退出,但不返回不同的错误级别。 按下任何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 "

暂停命令在Enter键和Escape键上退出,但不返回不同的错误级别。

按下任何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()来执行此操作:

^A是Ctrl+A(ASCII字符1)和^[是Ctrl+[(ASCII字符27或Esc)。命令行细分:

  • -c指定哪些击键是有效的(在本例中为Ctrl+A和Esc)
  • -d表示如果按Enter键,将使用哪个选项(“默认”选项)
  • -n隐藏选项列表
  • -q不显示按下的按键
  • -p指定要显示的提示

在这种情况下,如果按Esc键,则选择32返回退出代码2,如果按Enter键,则返回退出代码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

参考资料


如果可能的话,尝试使用纯批处理文件执行此操作将非常糟糕。您到底想做什么?Enter应重复(失败)操作,Escape应退出bat文件。在我的特殊情况下,我想在Oracle SqlPlus崩溃后关闭Escape窗口并在Enter上重新打开SQL脚本。谢谢,但我的Win7上没有choose32。我不允许在我的工作PC上安装它。choose32.exe是一个独立的.exe文件,不需要安装。重新检查它没有成功:dir/s c:\choose32*不会在我的Win 7 Professional SP1 64位上返回任何结果。并且我不允许使用任何未经批准的(外国)文件我的工作电脑上的软件。您必须下载choose32.exe并将其放入路径中的目录中。如果不允许您使用下载的软件,则除非您获得批准,否则这显然不是一个可行的解决方案。太好了!这一奇特的功能确实适用于windows标准软件(无需额外安装)当我使用Enter而不是Escape时。事实上,它也可以在没有延迟扩展的情况下工作(使用“%key%”而不是“!key!”)。谢谢。与xcopy解决方案相反,这个解决方案确实满足了我的要求:除了Enter,它甚至可以检测到单个ESC按键。
> Single Key Prompt? KeyCode = 27