我正在尝试使用两个choice
命令更改命令提示符的颜色。我知道choice
设置错误级别,但是当我选择任何数字时,只返回0。我做错了什么?
choice /c 0123456789abcdef /D 0 /t 25 /n /M "Choose background color: 0:Black 1:Blue 2:Green 3:Aqua 4:Red 5:Purple 6:Yellow 7:White 8:Gray 9:Light Blue A:Light Green B:Light Aqua C:Light Red D:Light Purple E:Light Yellow F:Bright White"
if errorlevel 16 set back=f
if errorlevel 15 set back=e
if errorlevel 14 set back=d
if errorlevel 13 set back=c
if errorlevel 12 set back=b
if errorlevel 11 set back=a
if errorlevel 10 set back=9
if errorlevel 9 set back=8
if errorlevel 8 set back=7
if errorlevel 7 set back=6
if errorlevel 6 set back=5
if errorlevel 5 set back=4
if errorlevel 4 set back=3
if errorlevel 3 set back=2
if errorlevel 2 set back=1
if errorlevel 1 set back=0
echo %back%
choice /c 0123456789abcdef /D 7 /t 25 /n /M "Choose text color: 0:Black 1:Blue 2:Green 3:Aqua 4:Red 5:Purple 6:Yellow 7:White 8:Gray 9:Light Blue A:Light Green B:Light Aqua C:Light Red D:Light Purple E:Light Yellow F:Bright White"
if errorlevel 16 set text=f
if errorlevel 15 set text=e
if errorlevel 14 set text=d
if errorlevel 13 set text=c
if errorlevel 12 set text=b
if errorlevel 11 set text=a
if errorlevel 10 set text=9
if errorlevel 9 set text=8
if errorlevel 8 set text=7
if errorlevel 7 set text=6
if errorlevel 6 set text=5
if errorlevel 5 set text=4
if errorlevel 4 set text=3
if errorlevel 3 set text=2
if errorlevel 2 set text=1
if errorlevel 1 set text=0
echo %text%
color %back%%text%
答案 0 :(得分:0)
您发布的问题是由于没有“不起作用”的描述而受到影响。
发布后,您会收到错误消息,因为/m
字符串可能无法扩展到多行。 可能一直是您的问题,因为它不会生成语法错误消息。
或者它可能是errorlevel
树的执行,可能会给你你的问题。
可悲的是,Dark One的编辑纠正了第一个问题。
我的方法(诚然,它没有做同样的演示)将是:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CALL :hue back 0 25 "Choose background"
CALL :hue text 7 25 "Choose text"
COLOR %back%%text%
ECHO %back%%text%
PAUSE
GOTO :eof
:: Parameters are : %1=varname, %2=default, %3=timeout, %4=prompt
:hue
cls
FOR %%a IN (0:Black
1:Blue 2:Green 3:Aqua 4:Red 5:Purple 6:Yellow 7:White 8:Gray
"9:Light Blue" "A:Light Green" "B:Light Aqua"
"C:Light Red" "D:Light Purple" "E:Light Yellow" "F:Bright White") DO (
ECHO %%~a
FOR /f "tokens=1*delims=:" %%c IN ("%%~a") DO (
IF %%c==%2 SET "%1=%%d"
)
)
choice /c 0123456789abcdef /D %2 /t %3 /n /M "%~4 [!%1!] "
SET "%1= 0123456789abcdef"
SET "%1=!%1:~%errorlevel%,1!"
GOTO :eof
即,使用所描述的参数调用例程:hue
。
:hue
通过让%%a
遍历括号中的字符串并echo
依次转到屏幕来工作。字符串由空格分隔,因此如果名称中需要空格,则引用所需的字符串。 ~
中的echo
删除了封闭的引号。
for..%%c..
从列表中依次获取每个字符串,删除任何封闭的引号,然后将引号应用于结果。 for /f
标记此结果字符串,将冒号前的部分(“delims”字符)放入%%c
,然后放入%%d
。当%%c
匹配%2
(提供给:hue
的第二个参数)时,%1
(提供的变量名)将设置为%%d
,其中包含来自%%a
的名称choice
中的字符串。
然后我们使用默认值,超时和来自%2 ..%4的消息执行~
(同一%
删除引号...)并通过提取值来添加名称变量set
。
然后errorlevel
变量到包含带有前导空格的所有字母的字符串,然后再从变量{{1}的%1
位置开始再到长度为1的子字符串}(从“字符0”开始,这是前导空格的原因)
是的 - 不适合初学者,但我已经解决了,所以我发布了以防有人发现它有用。