2010-03-09 55 views
4

为什么给出了如下的Windows 7。加利福尼亚的命令脚本:不支持Windows cmd-script变量值的括号?

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. 

错误消息在前看不见,如果我删除了“(86) “在路径名称中。

+0

HTTP:/ /stackoverflow.com/questions/6 478606/batch-file-if-statement-fails-was-unexpected-at-time- – resnyanskiy 2012-08-02 12:12:57

回答

0

问题是在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

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

C: 
CD\ 
dir /ogen /x 

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

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

+0

'/ ogen'到底做了什么?在W8 64位上,'dir/x'工作正常。 – akinuri 2015-09-25 19:38:40

+0

'/ ogen'用于排序。这里是DIR命令的开关列表。 https://technet.microsoft.com/en-us/library/cc755121.aspx – 2015-09-28 15:15:08

0

written about this a while ago(轻微现在已经过时)。

作为替代方案,如果你需要分组的命令,然后使用子程序:

if 3==3 call :foo 
... 
goto :eof 
:foo 
... 
goto :eof 
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% 
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 

,因为有在路径中的空间

+0

和IF之后使用SET SUN_JAVA_HOME =%SUN_JAVA_HOME:“=%'删除双引号,如果需要的话。 – it3xl 2018-03-01 16:50:01