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 文件。但是为什么会这样呢?只有当我第三次运行时所有变量都设置好了?看起来很奇怪。我在这方面做错了吗?

4

2 回答 2

8

Batch 总是将任何语句中的任何 %var% 替换为其 CURRENT 值,然后运行该语句。您的 IF 语句从 IF 关键字运行到右括号。

在第一次运行时,批处理替换(无)Java_home_path和 forjava_path因此ECHO %java_home_path%解释为“回声”,并且批处理报告其 ECHO 状态。

但是,java_home_path设置为c:\JDK1.6test.datJAVA_PATH设置为(nothing)\bin\java

在第二次运行时,这些现有值被适当报告,java_home_path设置自test.datJAVA_PATH设置为c:\JDK1.6\bin\java

在第三次运行时,您会得到您期望报告的名称。

治愈:(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

您的问题是变量的延迟扩展之一

要修复它,只需将脚本更改为 include 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 回答