1

我已经阅读了有关此的大部分主题,并且了解复杂的 if/then 块在 Windows 命令行中是一种痛苦,因此我尝试缩减规模,但我仍然以“(此时是意外的”结束错误。

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

我想不出比我正在做的更基本的事情了,因为命令外壳的内部工作超出了我的理解范围。

第一个版本:

@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
)
4

2 回答 2

5

当变量实际上为空时,您的代码语法错误。尝试

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

这保证了 . 的左侧总是有一些东西==

于 2013-01-11T18:21:52.723 回答
1

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

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

...变量名称是:“确认+空格”。您可以检查这一点,将这一行放在 set /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 %

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 开关来忽略大小写,因为用户可能会以大写形式输入 Y 或 N。

我希望它有帮助...

安东尼奥

于 2013-01-13T01:56:35.557 回答