我正在尝试编写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!将不起作用,因为命令解析器的重定向阶段发生在延迟扩展之前.