我已经阅读了大部分有关此内容的主题,并了解复杂的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
)
答案 0 :(得分:5)
当变量实际为空时,您的代码语法已损坏。尝试
if "%confirm%" == "y" (
保证==
左侧总有一些东西。
答案 1 :(得分:1)
1-在批处理文件中,SET var=value
和SET /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.
我希望它有所帮助...
安东尼奥