Windows批处理:“如果存在” - 路径存在,但它说不 - 为什么?

时间:2013-11-13 00:43:40

标签: windows batch-file

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

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

%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行也不会执行。

3 个答案:

答案 0 :(得分:3)

Raymond Chen once said

  

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

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

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

@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语句中删除了parethesis。

您可能还想检查双引号。像你一样在引号内输入变量名将从值中删除引号。这是一个例子:

C:\>set "test=foo bar"

C:\>echo %test%
foo bar

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

如果您需要 in 变量的值,请将它们放在右侧,如下所示:

C:\>set test="foo bar"

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

从头开始,为前者提供更多灵活性(请参阅@foxidrive评论),但这一切都取决于您必须使用的内容。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

批量识别“双引号”以分隔带引号的字符串,'但不是单引号'

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

BTW -

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
)

处理逻辑体操?

  • 但我认为这是一种风格问题 - 或者可能缺乏风格......