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

%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

レイモンド・チェンはかつてこう言いました

バッチ言語は設計されていません。それは進化しました。

それはそれを癖でいっぱいにします。一つは、括弧にこだわりがあることです。

次のコードは私のマシンで動作します:

@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

ifJAVA_HOME パスの括弧がステートメントを台無しにしています。辛いとは思いますが、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 に答える