使用空变量不一定会导致崩溃。但是在IF
案例中使用它们会导致程序崩溃。为什么?即使此处未设置EnableDelayedExpansion
,为什么不例如下面的变量PATHDEF
未被视为空变量?
使用输入APP
调用以下脚本将导致崩溃并显示不同的错误消息。 (即我使用输入参数调用下面的脚本,这将导致IF
评估为真)
在Windows控制台上:\Intel\iCLS was unexpected at this time.
在Bamboo服务器上:\Graphviz2.38\bin was unexpected at this time.
echo off
SET app=%1
SET PATHDEF=%PATH%
echo %PATHDEF% <--- This works. Prints path
echo %THIS% <--- This works. Prints "ECHO is off" (since %THIS% is empty)
IF %app%==APP (
echo %PATHDEF% <--- This causes crash!
)
答案 0 :(得分:2)
这是因为%PATH%中没有未转义的右括号。 PATH变量中的第一项是C:\Program Files (x86)\Intel\iCLS Client\
。
变量在运行时扩展,所以
IF %app%==APP (
echo %PATHDEF%
)
实际上被视为
IF %app%==APP (
echo C:\Program Files (x86)\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;
)
由于cmd解释器如何解析括号,它决定第一个未加引号的非转义括号是代码块的结尾,所以你的代码就像你写的那样对待
IF %app%==APP (
echo C:\Program Files (x86
)
\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;
由于代码块之外的事情首先被处理,脚本会识别\Intel\iCLS
不是有效命令,因此它会抛出错误而不是回显C:\Program Files (x86
。
有两种方法可以避免这种情况:
选项一 - 将变量放在引号中
IF %app%==APP (
echo "%PATHDEF%"
)
不幸的是,这意味着在显示时会包含引号。
选项二 - 将所有内容放在同一行
IF %app%==APP echo %PATHDEF%
没有左括号可以搞清楚所有内容,内容将正确打印而无需引用或转义任何内容。