2013-03-18 3 views
1

파일의 첫 번째 줄을 읽으려고하고 있는데 환경 변수로 설정하고 있습니다. 아래는 내가 TEST.DAT 가정배치 스크립트 설정 명령이 제대로 작동하지 않습니다.

@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% 
) 

사용하는 변수 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

+0

정확히 어떻게 달리고 있습니까? –

+0

@Peter Wright : 포맷 실수였습니다. 그것을 정정했다. 알아 내 주셔서 감사합니다 – Mojoy

답변

8

배치는 항상 현재의 값으로 모든 문에 어떤 %의 var에 %를 대체하고 실행 성명서. IF 문은 IF 키워드에서 닫는 괄호까지 실행됩니다.

처음 실행하면 Java_home_pathjava_path으로 바뀝니다. 따라서 ECHO %java_home_path%은 'echo'로 해석되고 배치는 ECHO 상태를보고합니다.

그러나이 java_home_path는, 이러한 기존의 값이 정당하게보고 test.dat에서 c:\JDK1.6로 설정되어 있지만 JAVA_PATH가 두 번째 실행에 (nothing)\bin\java

로 설정되어, java_home_pathtest.dat에서 설정되고 JAVA_PATHc:\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로 실행 중입니다! –

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! 
) 
관련 문제