(此时出乎意料

时间:2013-01-11 18:20:24

标签: windows batch-file

我已经阅读了大部分有关此内容的主题,并了解复杂的if / then块在Windows命令行中是一个痛苦,所以我尝试缩减,我仍然最终得到了“(出乎意料的是这一次“错误。

我觉得这与确定%确认%的位置有关,但我真的不确定。最初我在块中有一个goto,我读到的是禁止的,所以我尝试使用嵌套的if / if / else来解决这个问题。没有骰子。

我无法想到比我正在做的更基本的东西,因为命令shell的内部工作方式超出了我的范围。

第一版:

@echo off

TITLE cleanup

:: make user confirm they want to cleanup old epub conversion files
set /p confirm = "Are you sure? (y/n): "

if %confirm% == y (
    rm ePub
    rm IP
    rm OP
    md IP
    exit
) else (
    if %confirm% == n (
        exit
    ) else (
        set /p confirm = "Are you sure? (y/n): "
    )
)   

当前,缩小版本:

 @echo off

TITLE cleanup

:: make user confirm they want to cleanup old epub conversion files
set /p confirm = "Are you sure? (y/n): "

if %confirm% == y (
    rm ePub
    rm IP
    rm OP
    md IP
    exit
) else ( 
    exit
)

2 个答案:

答案 0 :(得分:5)

当变量实际为空时,您的代码语法已损坏。尝试

if "%confirm%" == "y" (

保证==左侧总有一些东西。

答案 1 :(得分:1)

1-在批处理文件中,SET var=valueSET /P var=prompt命令都将变量名称作为等号前面的完整字符串,包括空格!这意味着在此命令中:

set /p confirm = "Are you sure? (y/n): "

...变量名称为:“confirm + space”。您可以在设置/ p:

之后检查此行
echo Value of "confirm": %confirm%  Value of "confirm ": %confirm %

总之:在SET命令中等号前不要留空格

2-以同样的方式,分配给变量或用作提示的值是放在等号后面的完整字符串,包括引号。如果要分隔使用的值/提示符:在引号中包含变量名称和值/提示符;例如:

set /p "confirm=Are you sure? (y/n): "

当表达式可能包含特殊批处理字符时,在SET / A命令中尤其如此:SET /A "var=1<<16"。到目前为止,在SET / A命令的特定情况下,变量名和等号之间的空格将被忽略SET /A var = 1 echo %var%,而不是%var %。< / p>

3-独立于前两个点,如果变量值可能为空(如SET / P读取的变量),则该值应包含在IF命令的引号中(并且还将比较值与它的值)正如Ben Voigt先前提到的那样。这是因为如果用户只按Enter键,SET / P命令不会修改变量,所以你总是应该在SET / P命令之前用默认值初始化变量;否则,程序可能会处理在先前执行或上一个周期中输入的值!

set confirm=n
set /p "confirm=Are you sure? (y/n): "
if /I "%confirm%" == "y" (

上一个IF仍然需要引号,因为用户可能只输入空格!此外,它使用/ I切换忽略大小写,因为用户可以在uppper-case中输入Y或N.

我希望它有所帮助...

安东尼奥