3

我的批处理文件中有这个脚本——

if not exist "%JAVA_HOME%" (
    echo JAVA_HOME '%JAVA_HOME%' path doesn't exist) --- (1)
else (
    echo Setting JAVA property to '%JAVA_HOME%\bin\java' --- (2)
        set "JAVA=%JAVA_HOME%\bin\java")

%JAVA_HOME%被设置为C:\Program Files (x86)\Java\jdk1.7.0_45。这个位置存在于我的机器上,但上面的代码执行第 (1) 行,为什么?

跟进:

快把我逼疯了,我现在有这个剧本——

if "x%JAVA_HOME%" == "x" (
  set  JAVA=java
  echo JAVA_HOME is not set. Unexpected results may occur.
  echo Set JAVA_HOME to the directory of your local JDK to avoid this message.
) else (
  if not exist "%JAVA_HOME%" (
    echo Here ----------------------------------> note this line !!
    echo JAVA_HOME '%JAVA_HOME%' path doesn't exist
    goto END
  ) else (
    echo Setting JAVA property to '%JAVA_HOME%\bin\java'
    set "JAVA=%JAVA_HOME%\bin\java"
  )
)
:END

the%JAVA_HOME%设置正确(它是C:\Program Files (x86)\Java\jdk1.7.0_45)。但是当我运行时,我得到了这个错误——

prompt> test.bat
prompt> \Java\jdk1.7.0_45' was unexpected at this time
prompt>      echo JAVA_HOME 'C:\Program Files (x86)\Java\jdk1.7.0_45' path does not exist

到底是怎么回事?另请注意,该行echo Here也不会执行。

4

3 回答 3

3

Raymond Chen 曾经说过

未设计批处理语言;它进化了。

这使它充满了怪癖。其中之一是它对括号很挑剔。

以下代码适用于我的机器:

@echo off

if not exist "%JAVA_HOME%" (
    echo JAVA_HOME '%JAVA_HOME%' path doesn't exist
) else (
    echo Setting JAVA property to '%JAVA_HOME%\bin\java'
    set JAVA=%JAVA_HOME%\bin\java
)

) else (在一行上单独使用了一个括号,并从 echo 语句中删除了括号。

您可能还想检查双引号。像您所做的那样将变量名称放在引号内将从值中删除引号。这是一个例子:

C:\>set "test=foo bar"

C:\>echo %test%
foo bar

C:\>echo "%test%"
"foo bar"

如果您需要变量的值中加上引号,请将它们放在右侧,如下所示:

C:\>set test="foo bar"

C:\>echo %test%
"foo bar"

从头开始,选择前者会给你更多的灵活性(参见@foxidrive 评论),但这完全取决于你必须使用什么。

于 2013-11-13T01:43:53.400 回答
3

JAVA_HOME 路径中的括号弄乱了if语句。我知道这很痛苦,但我建议使用 8dot3 名称。

call :SET8DOT3 JAVA_HOME %JAVA_HOME%


:SET8DOT3
set %1=%~fs2
goto :END

所以整个事情就变成了...

call :SET8DOT3 JAVA_HOME "%JAVA_HOME%"

if "x%JAVA_HOME%" == "x" (
  set  JAVA=java
  echo JAVA_HOME is not set. Unexpected results may occur.
  echo Set JAVA_HOME to the directory of your local JDK to avoid this message.
) else (
  if not exist "%JAVA_HOME%" (
    echo Here ---------------------------------- note this line !!
    echo JAVA_HOME "%JAVA_HOME%" path doesn't exist
    goto END
  ) else (
    echo Setting JAVA property to "%JAVA_HOME%\bin\java"
    set "JAVA=%JAVA_HOME%\bin\java"
  )
)
goto :END

:SET8DOT3
set %1=%~fs2

:END
于 2013-11-14T14:24:36.047 回答
1

批处理识别“双引号”来分隔带引号的字符串,“但不是单引号”

因此,这是括号混淆的第 2 章。

顺便提一句 -

if defined var (echo var is defined
) else (
  echo var is not defined
)

优于if [not] "x%var%"=="x"

我永远被这个结构弄糊涂了

if not something (echo not something
 ) else (
 echo something
)

有什么问题

if something (echo something
 ) else (
 echo not something
)

哪个处理逻辑体操?

  • 但我认为这是风格问题——或者可能缺乏风格……
于 2013-11-14T12:47:24.177 回答