我的批处理文件中有这个脚本 -
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
行也不会执行。
答案 0 :(得分:3)
未设计批处理语言;它进化了。
这充满了怪癖。其中之一是它对括号很挑剔。
以下代码适用于我的机器:
@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
)
处理逻辑体操?