不允许使用Windows cmd脚本变量值中的括号?

时间:2010-03-09 16:13:12

标签: windows cmd

为什么提供以下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.

如果我删除了路径名中的“(x86)”,则错误消息会消失。

5 个答案:

答案 0 :(得分:2)

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

C:
CD\
dir /ogen /x

这将显示Program Files (x86)

的8个字符名称

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

答案 1 :(得分:1)

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

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

如果您启用delayed expansion并将%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

答案 2 :(得分:1)

你必须用双引号括起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"

因为路径中有空格

答案 3 :(得分:0)

written about this a while ago(现在稍微过时了)。

作为替代方案,如果您需要对命令进行分组,则使用子例程:

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

答案 4 :(得分:0)

Previous answer没问题。我只想用简单的例子来澄清它。它是关于在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%