在batch file的if / else语句中使用“)”

以下是不能按预期工作的片段:

set MYMACHINENAME=BuildmasterW32 if "%MYMACHINENAME%"=="BuildmasterW32" ( set PROGRAMFILESDIR=D:\Program Files set WISEDIR=D:\Program Files\Wise Installation Studio\WiseScript Package Editor ) if "%MYMACHINENAME%"=="BuildmasterW64" ( set PROGRAMFILESDIR=C:\Program Files (x86) set WISEDIR="C:\Program Files (x86)\Wise Installation Studio\WiseScript Package Editor" ) set WISEDIR rem we see `C:\Program Files (x86)\Wise Installation Studio\WiseScript Package Editor` at this point pause 

我希望看到D:\Program Files...值。

原因是上一行中的右括号(设置PROGRAMFILESDIR)closures了条件语句,并且WISEDIR的值被覆盖。

如果我用双引号括住PROGRAMFILESDIR的值,则代码工作正常,但PROGRAMFILESDIR等于"C:\Program Files (x86)" (引号转到variables),而不是C:\Program Files (x86)我需要。 这不是我想要的,因为PROGRAMFILESDIR是一个前缀,稍后添加相对path,因此值中不能有引号。

我试图在PROGRAMFILESDIR赋值行之前添加一个反斜杠) ,但是这似乎没有任何作用。

在我提供的代码片段中是否有解决scheme,或者我将不得不重写它来使用goto而不是if / else?

你需要避开括号:

 if /i "%MYMACHINENAME%"=="BuildmasterW64" ( set PROGRAMFILESDIR=C:\Program Files ^(x86^) set WISEDIR="C:\Program Files ^(x86^)\Wise Installation Studio\WiseScript Package Editor" ) 

哦,并添加/我使比较不区分大小写。

引用赋值操作,而不是引用值

 set "MYMACHINENAME=BuildmasterW32" if "%MYMACHINENAME%"=="BuildmasterW32" ( set "PROGRAMFILESDIR=D:\Program Files" set "WISEDIR=D:\Program Files\Wise Installation Studio\WiseScript Package Editor" ) if "%MYMACHINENAME%"=="BuildmasterW64" ( set "PROGRAMFILESDIR=C:\Program Files (x86)" set "WISEDIR=C:\Program Files (x86)\Wise Installation Studio\WiseScript Package Editor" ) set WISEDIR pause