我正在尝试从文件中读取第一行,并将其设置为环境变量。以下是我使用的变量
@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文件。但为什么会这样呢?只有当我第三次运行所有变量设置?看起来很奇怪。我在这做错了吗?请帮帮我。
答案 0 :(得分:8)
Batch总是将任何语句中的%var%替换为其CURRENT值,然后THEN运行该语句。您的IF语句从IF关键字运行到右括号。
在第一次运行时,批量替换(无)为Java_home_path
和java_path
,因此ECHO %java_home_path%
被解释为'echo`并且批量报告其ECHO状态。
但是,java_home_path
设置为c:\JDK1.6
test.dat
但JAVA_PATH
设置为(nothing)\bin\java
在第二次运行时,会及时报告这些现有值,java_home_path
设置为test.dat
,JAVA_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%
答案 1 :(得分:3)
您的问题是Delayed Expansion of variables之一。
要解决此问题,只需更改您的脚本以包含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!
)