Windows cmd-scriptvariables值中的括号不被允许?

为什么会提供以下Windows 7 .cmd命令脚本:

set SUN_JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_17 if 3==3 ( set JAVA_HOME=%SUN_JAVA_HOME% ) echo ready 

下面的错误消息,而不是打印“就绪”

 \Java\jdk1.6.0_17 was unexpected at this time. 

如果我删除path名中的“(x86)”,错误消息消失。

Solutions Collecting From Web of "Windows cmd-scriptvariables值中的括号不被允许?"

问题是if 3==3部分之后的括号分组。

在解析set JAVA_HOME=%SUN_JAVA_HOME%命令时,解释器会立即替换%SUN_JAVA_HOME%变量,并导致(386) %SUN_JAVA_HOME%括号的早期匹配。

如果启用延迟扩展并将!SUN_JAVA_HOME! %SUN_JAVA_HOME%替换为!SUN_JAVA_HOME!

 setlocal enabledelayedexpansion set SUN_JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_17 if 3==3 ( set JAVA_HOME=!SUN_JAVA_HOME! ) echo ready 

在命令提示符处输入以下命令

 C: CD\ dir /ogen /x 

这将向您显示Program Files (x86)的8个字符名称

使用该名称(可能是“Progra〜2”

我刚才写了一些关于这个 (稍微过时)的文章。

或者,如果您需要分组命令,则使用子例程:

 if 3==3 call :foo ... goto :eof :foo ... goto :eof 

以前的答案是可以的。 我只是想用简单的例子来澄清一下。 这是关于在x86和x64系统上检测32位应用程序的Program Files目录。 与“(x86)”有类似的问题。

 IF DEFINED ProgramFiles(x86) (GOTO x64) ELSE (GOTO x86) :x64 SET AppDir=%ProgramFiles(x86)%\SomeFolder GOTO next :x86 SET AppDir=%ProgramFiles%\SomeFolder :next ECHO %AppDir% 

你必须用双引号括住set命令

更换

 set SUN_JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_17 

通过

 set SUN_JAVA_HOME="C:\Program Files (x86)\Java\jdk1.6.0_17" 

因为路上有空间