2012-03-19 1 views
3

ERRORLEVEL을 확인하기 위해 호출되는 서브 루틴이 있습니다.
서브 루틴은 msg를 기록하고 전자 메일을 보낸 다음 스크립트에서 나가는 다른 서브 루틴을 호출합니다. 그런 다음, :END에가는 문제는 제대로 나가셨입니다Windows 배치 : 호출 된 서브 루틴에서 종료 할 수 없습니다. goto가 끝나더라도 항상 반환합니다. END

@echo off 
echo starting... 
call:checkTime 
echo +++ after CT 
GOTO:END 

:checkTime 
echo the time is %TIME% 
goto:END 
goto:EOF 

:END 
+0

MS-DOS를 사용하고 있지 않습니까? –

+0

Windows 2003의 DOS 배치 스크립트 – chrys2012

+0

"DOS"배치 스크립트 (Windows Server 2003의 경우)와 같은 것은 없습니다. 여전히 Windows 배치 스크립트입니다. –

답변

3

호출 후 STMT에 반환하지만 나는 문제의

내 해석 (I 제목에 집중할 특히) 이해 생각 :

배치 파일의 여러 지점에서 ERRORLEVEL을 확인합니다. 오류를 발견 할 때마다 표준 오류 처리를 수행 한 다음 배치 스크립트를 종료해야합니다. 표준 처리를 수행하기 위해 서브 루틴을 작성하려고했으나 서브 루틴이 스크립트를 종료하는 대신 호출자에게 리턴합니다. 귀하의 질문은 호출자에게 반환하는 대신 오류 처리 루틴을 강제 종료하는 방법입니다.

답변 : 귀하의 오류 검출 것도 불리는 서브 루틴 내에서 발생하지 않으면

, 당신은 단순히 그것을 호출하는 대신 오류 프로세서를 고토 수 있습니다. 다른 호출 된 루틴 내에서 루틴 종료를 호출 할 수있게하려면

는, 당신은 CALL 문을 계속 사용할 수 있지만, EXIT 대신 GOTO :EOF 또는 GOTO :END와 오류 루틴을 종료 할 수 있습니다. 응답

부록은

예, GOTO 매개 변수를 전달할 수 없습니다 언급하고, 호출 된 루틴은 항상 호출자에게 돌아갑니다

그리고 네, EXIT가 종료됩니다 (EXIT와 루틴이 종료하지 않는 한) 현재 CMD 쉘은 콘솔 창을 닫습니다.

하지만 ... 배치 파일을 다른 CMD 셸에서 실행할 수 있으므로 EXIT가 창을 닫지 않습니다!

배치 파일 (및 실행중인 CMD 셸)이 종료되면 환경에 대한 변경 사항이 손실된다는 단점이 있습니다. 그것은 당신을 위해 문제 일지도 모르거나 아닐지도 모른다.

@echo off 
if "%~1" equ "_GO_" goto :main 
cmd /c ^""%~f0" _GO_ %*^" 
exit /b 

:main 
shift /1 
echo %%1=%1 %%2=%2 

echo before call 
call :exitRoutine 
:: should not get here 
echo after call 
exit /b 

:exitRoutine 
echo exiting batch file witin exitRoutine 
exit 
+0

에러 루틴이 발생하면 매개 변수를 루틴에 전달할 수 없습니다. 맞습니까? 나가면 CMD 창이 닫힙니다. 무슨 일이 예상되는 행동입니까? 예. 호출 된 루틴 GOTO : END 호출자에게 반환? 감사합니다 – chrys2012

+0

@ chrys2012 - 내가 당신을 위해 일할 것이라고 생각하는 해결책으로 답변을 업데이트했습니다 – dbenham

+1

@dbenham : +1 재미있는 해결책, Dave! 'EXIT'는 이런 식으로 어떤 레벨에서도 계류중인 IF/FOR 구조를 깨기 위해 사용될 수 있으며, 프로세스는 호출 코드에서 계속됩니다. 'set break = exit' 매크로를 제안해도 될까요? (우리는 이미 WHILE 매크로에서이 아이디어를 사용했습니다.) – Aacini

2

예, 이것은 예상 된 동작입니다 : CALL 명령을 통해라는 서브 루틴은 세 가지 방법으로 끝날 수 : EXIT [/B] 실행 GOTO :EOF을 실행하거나 파일의 끝에 도달. 세 가지 방법 모두 호출 프로그램으로 되돌아갑니다. "GOTO 명령은 이제 : EOF를 사용하여 현재 배치 스크립트 파일의 끝으로 제어권을 이전합니다. 이것은 레이블을 정의하지 않고 배치 스크립트 파일을 종료하는 쉬운 방법입니다." (GOTO /?), 실제로 두 번째 및 세 번째 방법은 동일합니다.

가끔 서브 루틴에서 반환 할 경우

하지만, 다른 시간은 호출 프로그램, 다음 서브CALL 통해 실행하지만, 다른 다른 방법으로 할 수없는을 종료합니다. 서브 프로그램에 매개 변수를 전달하려면 별도의 매개 변수 여야합니다.예를 들어 매개 변수와 NO 호출의 이름을 통해 실행됩니다 BAT 파일 :

subprogram param1 param2 ... 

이 방법을 위해이 서브 프로그램에 대한, 그것은 배치 파일을 이십 기가 바이트 알고 있어야합니다 호출 프로그램에 "반환"과 어떤 줄에서 돌아와야하는지. 이 정보는 변수를 통해 호출 프로그램에 의해 설정 될 수 있습니다. 호출 프로그램은 정상적인 방법으로 실행 중인지 또는 false 서브 루틴이 리턴되었는지를 판별해야합니다. 당신은이 방법으로 그렇게 할 수 있습니다

main.bat :

@echo off 
rem If this is a false subroutine return: complete it 
if "%1" == "return" goto %2 
rem Do my usual business 
rem . . . 
rem Execute the subprogram as subroutine 
set caller=main 
set returnPoint=label23 
subprogram param1 param2 
:label23 
rem Continue after subprogram return... 

subprogram.bat :

rem Do my business 
rem . . . 
rem To return to the caller: 
%caller% return %returnPoint% 
rem . . . 
rem To terminate here, execute EXIT /B, GOTO :EOF, or just reach the end 

죄송합니다,이 작업을 수행하는 쉬운 방법이 없습니다 ...

+0

종합적인 답변에 감사드립니다. – chrys2012

+0

"by the while"GOTO 명령은 현재 대상 배치 레이블을 받아들입니다 : EOF는 제어를 현재 배치 스크립트 파일의 끝으로 전달합니다. 이것은 라벨을 정의하지 않고 배치 스크립트 파일을 종료하는 쉬운 방법입니다. " – chrys2012

+0

각 서브 루틴의 끝에서 GOTO : EOF를 사용하여 배치 스크립트 파일을 종료하지 않고 서브 루틴을 실행합니다. – chrys2012

관련 문제