Windows上的某些批处理文件使用带有多行的IF语法,如下所示:
if var==rule (
some comands
) else (
else commands
)
现在,Windows Vista x64决定将所有32位文件放在“C:\ Program Files(x86)”下。不幸的是,每当你在没有引号的多行IF中使用环境变量(例如PATH)时,变量值内的括号会混淆IF,从而中止批处理文件。例如:
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%出现的行未执行。这很烦人。有解决方案吗?
答案 0 :(得分:9)
将%SCALA_HOME%
的所有实例更改为!SCALA_HOME!
,并在文件顶部附近添加以下内容:
setlocal enableextensions enabledelayedexpansion
后者打开“延迟变量扩展”,这意味着以!VAR!
形式编写的变量在使用之前不会扩展,而不是在解析语句本身时。 (在我有限的经验中,当然在这种情况下,这意味着变量扩展不太可能被误解为实际的批处理文件语法结构。)感谢Patrick Cuff在评论中指出这种更好的方式。
P.S。:正如您所发现的那样,cmd.exe
批处理文件语言在很多方面都被严重打破。如果您不能使用真正的脚本语言(例如,如果您的任务需要在其他计算机上执行),我会认真地推荐使用快速的C / C ++“脚本”来完成这项工作,并将其编译为.EXE。