语法quirk on将带括号的字符串赋给IF块中的变量

时间:2015-12-10 23:35:56

标签: batch-file cmd

以下是BAT文件示例,其中显示了一种奇怪的行为。当一个" SET"在inside()中使用IF语句我们得到一个错误,如果除了SET之外我们还有其他代码那么没问题。

我通过在IF线上执行SET并在正常情况下执行我需要的其他逻辑来创建一个解决方法 IF ... (填充) ELSE (更多)

有人知道这里发生了什么吗?

注意:如果使用SETLOCAL,结果相同

::SETLOCAL ENABLEDELAYEDEXPANSION
echo **This works**
@set InstallerTest=false
@IF "%InstallerTest%"=="true" @SET SESign_Exe=%ProgramFiles(x86)%\Schneider Electric\CodeSign\signtrue.exe
@IF NOT "%InstallerTest%"=="true" @SET SESign_Exe=%ProgramFiles(x86)%\Schneider Electric\CodeSign\signfalse.exe
SET SESign_Exe

ECHO **THIS PRODUCES NO ERROR** 
@IF "%InstallerTest%"=="true" (
    echo IN TRUE PART
) ELSE (
    ECHO IN FALSE PART
)

echo **this produces : \Schneider was unexpected at this time.**
@IF "%InstallerTest%"=="true" (
    SET SESign_Exe=%ProgramFiles(x86)%\Schneider Electric\CodeSign\signtrue.exe
) ELSE (
    SET SESign_Exe=%ProgramFiles(x86)%\Schneider Electric\CodeSign\signfalse.exe
)
::ENDLOCAL

1 个答案:

答案 0 :(得分:1)

打开命令提示符窗口并执行cmd /?。在最后一个帮助页面输出到控制台窗口的底部,您可以读取字符串中哪些字符需要周围的双引号:空格字符和&()[]{}^=;!'+,`~

原因很容易理解。空格字符是命令行上“单词”(命令,选项,参数,关键字......)的分隔符。

其他字符在Windows命令行语法中具有特殊含义。未转义且未加引号的字符串定义(标记块的开头)标记块的结尾(如果未转义)或引用的字符串内。

因此你需要

set "SESign_Exe=%ProgramFiles(x86)%\Schneider Electric\CodeSign\signtrue.exe"

你应该始终使用set "variable=value"

请参阅Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案,了解有关使用set "variable=value"总是优于仅使用set variable=value的原因的解释的示例。