在批处理CHOICE命令中突出显示默认选项

时间:2016-07-06 22:31:13

标签: batch-file cmd

choice命令通常用于批量编码。它有/n选项来隐藏ChoiceKeys。 This robvanderwoude.com page解释了如何使用ANSI序列突出显示特定的文本属性。但它并没有在实际批量代码中提供使用示例。

所以,我问是否可以使用ANSI序列突出显示CHOICE命令中的默认选项,即使用粗体或下划线,可能使用包含一个或所有选择字母的变量消息?或者,可能有不同的方法来实现这一点,除了在短信中使用(C)apital字母作为默认选择?

choice /c ox /n /m "C(o)ntinue or e(x)it?" /t 20 /d o

ANSI序列支持is back in Windows 10,但Microsoft没有提供代码使用示例。

2 个答案:

答案 0 :(得分:2)

我最初尝试了这种方法:

choice /c ox /n /m "C(%ESC%[1;33mo%ESC%[0m)ntinue or e(x)it?" /t 20 /d o

但是,似乎choice命令将其消息直接发送到屏幕,绕过ANSI驱动程序管理,因此此方法不起作用(至少在我的系统上不起作用)。

解决这一问题的方法是使用单独的set /P命令来显示消息,然后执行choice命令而不显示消息:

@echo off
setlocal

for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
echo Normal text%ESC%[1;31m RED TEXT%ESC%[1;32m GREEN TEXT%ESC%[0m
echo/
set /P "=C(%ESC%[1;33mo%ESC%[0m)ntinue or e(x)it? " < NUL
choice /c ox /n /t 20 /d o
echo Option: %errorlevel%

这是输出:

ANSI test

注意:这个答案只是解决了原始问题中所述的“如何使用ANSI序列突出显示CHOICE命令中的默认选项”这一点。我没有触及任何特定机器上ANSI序列可用性的观点;这是完全不同的事情。

答案 1 :(得分:0)

大!由于代码格式在Stack Overflow评论中不起作用,我将其作为答案发布。 Aacini的CHOICE消息代码在没有set /P的Windows 10 64位中运行良好(在我的电脑上)。

然而,可能有一种更简单的方法来实现这一目标? :)也许我们应该回顾一下,在类似的情况下如何在Windows 95中完成(尽管CHOICE命令还没有)。无论如何,似乎FOR行可以在具有多个颜色消息的批处理中添加一次。以上代码仅适用于支持ANSI序列的Windows版本。

@echo off
setlocal

for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
choice /c ox /n /m "C(%ESC%[1;33mo%ESC%[0m)ntinue or e(x)it?" /t 20 /d o
echo Option: %errorlevel%

:eol