1

ファイルから最初の行を読み取ろうとしていて、それを環境変数として設定しています。以下は私が使用する変数です

@echo off
if EXIST "test.dat" (
    set JAVA_HOME_PATH=
    set JAVA_PATH=
    set /p JAVA_HOME_PATH=<test.dat
    echo %JAVA_HOME_PATH%
    set JAVA_PATH=%JAVA_HOME_PATH%\bin\java
    echo %JAVA_PATH%
  )

test.datにJDKへのパスが含まれていると仮定し、それがc:\JDK1.6の場合

初めて実行すると

ECHO is off.
ECHO is off.

もう一度走ると

c:\JDK1.6
\bin\java

そして再び走ると私は

c:\JDK1.6
c:\JDK1.6\bin\java

test.datファイルを変更します。しかし、なぜこれが起こっているのですか?3回実行した場合にのみ、すべての変数が設定されますか?奇妙に見えます。私はこれで何か間違ったことをしていますか?

4

2 に答える 2

8

バッチは常に、ステートメント内の %var% をその CURRENT 値に置き換え、THEN ステートメントを実行します。IF ステートメントは、IF キーワードから閉じ括弧まで実行されます。

Java_home_path最初の実行では、バッチはと を(何も) 置換するjava_pathため、ECHO %java_home_path%は「エコー」として解釈され、バッチはその ECHO ステータスを報告します。

ただし、からjava_home_pathに設定されていますが、に設定されていますc:\JDK1.6test.datJAVA_PATH(nothing)\bin\java

2 回目の実行では、これらの既存の値が適切に報告され、java_home_pathから設定されtest.datJAVA_PATHに設定されます。c:\JDK1.6\bin\java

3 回目の実行では、期待どおりの名前が報告されます。

キュア: (1)

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
if EXIST "test.dat" (
    set JAVA_HOME_PATH=
    set JAVA_PATH=
    set /p JAVA_HOME_PATH=<test.dat
    echo !JAVA_HOME_PATH!
    set JAVA_PATH=%JAVA_HOME_PATH%\bin\java
    echo !JAVA_PATH!
  )

キュア: (2)

@echo off
if not EXIST "test.dat" ECHO No test.dat&goto :eof
set JAVA_HOME_PATH=
set JAVA_PATH=
set /p JAVA_HOME_PATH=<test.dat
echo %JAVA_HOME_PATH%
set JAVA_PATH=%JAVA_HOME_PATH%\bin\java
echo %JAVA_PATH%
于 2013-03-18T14:57:59.083 に答える
3

あなたの問題は変数の遅延拡張の1 つです。

これを修正するには、スクリプトを include に変更し、asの代わりにSETLOCAL ENABLEDELAYEDEXPANSION使用します。!!%%

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
if EXIST "test.dat" (
    set JAVA_HOME_PATH=
    set JAVA_PATH=
    set /p JAVA_HOME_PATH=<test.dat
    echo !JAVA_HOME_PATH!
    set JAVA_PATH=!JAVA_HOME_PATH!\bin\java
    echo !JAVA_PATH!
)
于 2013-03-18T14:48:17.437 に答える