以下是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
答案 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
的原因的解释的示例。