为什么空变量导致崩溃

时间:2017-11-20 14:23:36

标签: windows batch-file

使用空变量不一定会导致崩溃。但是在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!
)

1 个答案:

答案 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%

没有左括号可以搞清楚所有内容,内容将正确打印而无需引用或转义任何内容。