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

时间:2014-10-21 18:12:24

标签: batch-file cmd interactive

Pause命令退出Enter和Escape键,但不会返回独特的ErrorLevel 按任何Enter或Escape键时,Choice命令不会返回。

3 个答案:

答案 0 :(得分:3)

为了检测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要求按键开始复制,然后它会显示密钥并结束。

答案 1 :(得分:1)

您可以使用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告诉按下Enter键时使用哪个选项("默认"选择)。
  • -n隐藏了选项列表。
  • -q不显示按下的击键。
  • -p指定要显示的提示。

在这种情况下,如果按下Esc,则select32返回退出代码2,如果按下Enter则退出代码1。

答案 2 :(得分:0)

我发现这个问题很有趣,并希望添加另一个可能的解决方案,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


<强>参考
TechNet
PS Pause Alternative