2013-03-18 160 views
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文件。但为什么会发生?只有当我第三次运行所有的变量设置?看起来很奇怪。我在这做什么不对吗?请帮助我。

+0

为什么有''%在第一行上的文件名? – Magoo 2013-03-18 14:44:16

+0

你究竟如何运行它? – 2013-03-18 14:44:19

+0

@彼得赖特:那是格式错误。更正它。感谢您计算出来 – Mojoy 2013-03-18 14:54:29

回答

8

批次总是与它的当前值的任何语句替换任何%VAR%,然后运行声明。您的IF语句从IF关键字运行到结束括号。

在第一次运行时,Java_home_pathjava_path的批次替代(无),因此ECHO %java_home_path%被解释为'echo',批次报告其ECHO状态。

然而,java_home_pathtest.dat设置为c:\JDK1.6JAVA_PATH设置为(nothing)\bin\java

在第二次运行中,这些现有值被适时报告,java_home_pathtest.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% 
+0

+1进行详细说明! – 2013-03-18 14:59:18

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! 
)