批处理中嵌套 IF ( IF ( ... ) ELSE( .. ) ) 语句

2024-05-04

我正在尝试写一个IF ELSE语句嵌套在另一个语句中IF陈述。这是我所拥有的:

IF %dirdive%==1 ( 
    IF DEFINED log (
        ECHO %DATE%, %TIME% >> %log%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log%
        )
        GOTO :end
    ) ELSE ( 
        ECHO %DATE%, %TIME%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2%
        )
        GOTO :end
    )
)

When log没有定义,我得到:

The syntax of the command is incorrect.
ECHO Wed 07/18/2012, 15:50:12.34 >>

啊啊我不知所措。我尝试过使用括号。我已将最后一个 ) 移到与之前的同一行,但它不起作用。事情是, log 被定义为。它似乎在之后或之后立即中断IF %dirdive%==1,因为它不会到达之后插入的 echo 命令。


问题的根源在于,即使 IF 语句的分支不执行,它仍然必须具有有效的语法。

When log未定义,则以下行

ECHO %DATE%, %TIME% >> %log%

展开为以下时log未定义

ECHO someDate, someTime >>

重定向后没有文件名,导致语法错误。

只要你的log变量尚未用引号定义(当它被定义时),那么只需按如下方式更改该行即可修复它:

ECHO %DATE%, %TIME% >> "%log%"

当该行扩展为以下内容时log未定义

ECHO someDate, someTime >> ""

这是有效的语法。如果执行它会失败并出现“系统找不到指定的路径”错误,但它不会执行,因为日志未定义:-)

EDIT

也许更好的解决方案是定义一个新变量,在值中包含重定向运算符当且仅当log被定义为。那么您甚至不需要大的 IF 语句,并且代码更容易维护。

SET "redirect="
IF DEFINED log SET "redirect=>>!log!"
IF %dirdive%==1 (
  ECHO %DATE%, %TIME% %redirect%
  FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G
    CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log%
  )
  GOTO :end
)

注意正常扩展%redirect%必须在 ECHO 语句中使用。延迟扩张!redirect!将不起作用,因为命令解析器的重定向阶段发生在延迟扩展之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批处理中嵌套 IF ( IF ( ... ) ELSE( .. ) ) 语句 的相关文章

随机推荐