批量嵌套IF(IF(...)ELSE(..))语句

Ful*_*igh 16 batch-file

我正在尝试编写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
    )
)
Run Code Online (Sandbox Code Playgroud)

什么时候log没有定义,我得到:

The syntax of the command is incorrect.
ECHO Wed 07/18/2012, 15:50:12.34 >>
Run Code Online (Sandbox Code Playgroud)

Aaaand我不知所措.我试过玩括号.我把最后一个移动到与之前相同的线上并且它不起作用.问题是, log 定义时工作正常.它似乎在之后或之后中断IF %dirdive%==1,因为它不会在之后插入回显命令.

dbe*_*ham 15

您的问题的根源是,即使IF语句的分支未执行,它仍然必须具有有效的语法.

何时log未定义,则为以下行

ECHO %DATE%, %TIME% >> %log%
Run Code Online (Sandbox Code Playgroud)

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

ECHO someDate, someTime >>
Run Code Online (Sandbox Code Playgroud)

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

只要您的log变量尚未使用封闭引号定义(当它被定义时),那么只需按如下方式更改行就可以修复它:

ECHO %DATE%, %TIME% >> "%log%"
Run Code Online (Sandbox Code Playgroud)

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

ECHO someDate, someTime >> ""
Run Code Online (Sandbox Code Playgroud)

哪个是有效的语法.如果执行了"系统无法找到指定的路径"错误,它将失败,但由于日志未定义,它将无法执行:-)

编辑

也许更好的解决方案是定义一个新变量,当且仅当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
)
Run Code Online (Sandbox Code Playgroud)

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