问题的根源在于,即使 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!
将不起作用,因为命令解析器的重定向阶段发生在延迟扩展之前。