배치(batch) 파일에서 또 다른 배치 파일을 동기 방식으로 실행 및 반환값 얻기
제목짓기 정말 어렵군요. ^^;
그냥 설명해 보면, 보통 다음과 같은 배치 파일들이 있을 때,
==== one.bat ====
@ECHO OFF
echo ONE Batch
two.bat
echo ONE Complete
==== two.bat ====
@ECHO OFF
echo TWO Batch
echo TWO Complete
아마도 원래 의도했던 실행 결과는 다음과 같겠죠!
D:\...>one.bat
ONE Batch
TWO Batch
TWO Complete
ONE Complete
D:\...>
그런데, 배치 파일의 제어가 one.bat에서 two.bat로 완전히 넘어가버려서 two.bat 실행을 완료한 이후 one.bat로 돌아가지 않고 아래와 같이 바로 종료해 버립니다.
D:\...>one.bat
ONE Batch
TWO Batch
TWO Complete
D:\...>
바로 이런 경우, 원하는 결과를 얻으려면 다음과 같이 cmd.exe의 힘을 빌어야 합니다.
==== one.bat ====
@ECHO OFF
echo ONE Batch
cmd.exe /C two.bat
echo ONE Complete
이렇게 cmd.exe에 "/C" 옵션을 주면, 새로운 cmd.exe 명령어 쉘이 실행되고 그 내부에서 지정된 two.bat 파일을 실행한 후 부모 프로세스로 제어가 돌아가게 됩니다. 따라서, 의도했던 데로 one.bat의 남은 부분이 계속 실행됩니다. 또한, "/K" 옵션을 주어서 구현하는 것도 가능합니다. 이런 경우에는 대상 batch 파일에서 직접 exit 명령을 주어야 합니다.
==== one.bat ====
@ECHO OFF
echo ONE Batch
cmd.exe /K two.bat
echo ONE Complete
==== two.bat ====
@ECHO OFF
echo TWO Batch
echo TWO Complete
exit
자... 이제 슬슬 "반환값" 처리에 대해서 궁금해지는데요. 배치 파일에서 exit 구문을 사용하는 것으로 해결이 됩니다. 예를 들어, 아래는 무조건 "Error..." 문자열을 출력합니다.
==== one.bat ====
@ECHO OFF
echo ONE Batch
cmd.exe /C two.bat
if %ERRORLEVEL% == 0 ( goto NoError
) ELSE (
echo Error...
)
:NoError
echo ONE Complete
==== two.bat ====
@ECHO OFF
echo TWO Batch
echo TWO Complete
exit 1
만약, "exit 0" 또는 그냥 "exit"로 두거나 "/C" 옵션으로 실행했으므로 명시하지 않으면 기본값으로 0이 적용되어 "goto NoError" 문이 실행됩니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]