batch file,Vista x64,如果和括号

Windows上的一些batch file使用多行IF语法,如下所示:

if var==rule ( some comands ) else ( else commands ) 

现在,Windows Vista x64决定将所有32位文件放在“C:\ Program Files(x86)”下。 不幸的是,无论什么时候在多行IF中使用一个环境variables(如PATH)而没有引号,variables值中的圆括号就会混淆IF,中止batch file。 例如:

 if "%OS%"=="Windows_NT" ( @setlocal call :set_home set _ARGS=%* ) else ( set _SCALA_HOME=%SCALA_HOME% rem The following line tests SCALA_HOME instead of _SCALA_HOME, because rem the above change to _SCALA_HOME is not visible within this block. if "%SCALA_HOME%"=="" goto error1 call :set_args ) 

即使%SCALA_HOME%出现的行没有被执行,一个batch file也会失败。 这很烦人。 有这个解决scheme吗?

%SCALA_HOME%所有实例更改为!SCALA_HOME! ,并在文件顶部附近添加以下内容:

 setlocal enableextensions enabledelayedexpansion 

后者打开“延迟变量扩展”,这意味着变量写在窗体!VAR! 在使用之前不会扩展,而不是在语句本身被解析的时候。 (以我有限的经验,当然在这种情况下,这意味着变量扩展不太可能被误解为实际的批处理文件语法结构。)感谢Patrick Cuff在评论中指出了这种更好的方式。

PS:正如你所发现的那样, cmd.exe批处理文件语言在很多方面都是可怕的 。 如果你不能使用真正的脚本语言(例如,如果你的任务需要在其他计算机上执行),我会认真建议敲出一个快速的C / C ++“脚本”来完成这项工作,并将其编译为.EXE。