2011-02-09 5 views
1

의 이상한 DOS 배치 스크립트보고 아래 스크립트에서 SQL 오류가 발생하면 %errorlevel%이 0 인 이유는 무엇입니까?% errorlevel %

IF %RELEASE% GTR 2 (
    (
    echo WHENEVER SQLERROR EXIT FAILURE 
    echo @release.sql 
    echo exit 
    ) | sqlplus x/[email protected] 
    echo error: %errorlevel% 
    if %errorlevel% gtr 0 goto dberror 
) 

if 블록을 제거하면 % errorlevel %은 (는) 0이 아닙니다! if 문이 오류 수준에 영향을주는 이유는 무엇입니까?

(
    echo WHENEVER SQLERROR EXIT FAILURE 
    echo @release.sql 
    echo exit 
    ) | sqlplus x/[email protected] 
    echo error: %errorlevel% 
    if %errorlevel% gtr 0 goto dberror 

업데이트

: 그것은 내가 오류를 테스트 한 방법이었다 생각합니다. 내가 대신의 생각 :

if %errorlevel% gtr 0 goto dberror 

.. 사용한다 :

if errorlevel 1 goto dberror 

유용한 링크 here

+0

예. 'errorlevel 1'은 실제로 'errorlevel이 1 이상인 경우'를 의미합니다. Errorlevel은 환경 변수가 아닙니다. 마지막으로 실행 된 프로세스의 종료 코드를 나타내며 자체의 작은 if 구문을 갖습니다. : D – GolezTrol

+0

@GolezTrol : 검사를위한 자체 구문을 가지고 있지만 환경 변수이기도하고 다른 변수와 마찬가지로 사용할 수 있습니다 : 매개 변수로 매개 변수 전달, 반향 출력 ... –

답변

4

한숨을. 그것은 끔찍한 dos 파싱과 관련이 있으며 cmd%errorlevel%을 그 값으로 대체합니다. ( ... )으로 명령을 묶었을 때 cmd은 마치 한 줄에 모든 문자가 쓰여지는 것처럼 명령을 읽습니다. 따라서 첫 번째 코드 블록에서 %errorlevel%은 블록이 구문 분석 될 때 값으로 바뀝니다..

IF 3 GTR 2 (
    (
    echo WHENEVER SQLERROR EXIT FAILURE 
    echo @release.sql 
    echo exit 
    ) | sqlplus x/[email protected] 
    echo error: 0 
    if 0 gtr 0 goto dberror 
) 

($RELEASE 3이었다 가정) : 당신이 쓴 것처럼입니다. if errorlevel이 수정되는 이유는 cmd이 해당 재구성에서 초기 변수 확장을 수행하지 않기 때문입니다. 이 문제를 피하기 위해 call를 사용할 수 있습니다 (I 물론 명확보다는 startlocal ENABLEDELAYEDEXPANSION!errorlevel! -YMMV 생각)

IF %RELEASE% GTR 2 (
    (
    echo WHENEVER SQLERROR EXIT FAILURE 
    echo @release.sql 
    echo exit 
    ) | sqlplus x/[email protected] 
    call echo error: %%errorlevel%% 
    call if %%errorlevel%% gtr 0 goto dberror 
) 

.

+0

+1! 'call'에 대한 좋은 팁, 감사합니다! –

+1

P. errorlevel을 음수 (!)로 설정할 수 있으므로 'NEQ 0'이 가장 포괄적 인 테스트입니다. (나는 또 다른 한숨이오고 있다고 느낀다.) – bobbogo

관련 문제