Batch file 如何在交互式Windows bat/cmd脚本(cmd.exe)中区分Enter键和Escape键?
暂停命令在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键时,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