为什么变量的值总是为零?

时间:2018-02-27 01:53:47

标签: batch-file colors

我正在尝试使用两个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%

1 个答案:

答案 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”开始,这是前导空格的原因)

是的 - 不适合初学者,但我已经解决了,所以我发布了以防有人发现它有用。