cmd.exe의 for 문에서는 ERRORLEVEL이 설정되지 않는 문제
예를 들어 다음과 같이 콘솔 프로그램을 만들고,
using System;
class Program
{
static int Main(string[] args)
{
Console.WriteLine("test");
return args.Length;
}
}
이것을 for 문에서 사용하면,
REM test.bat
echo off
for /f %%i in ('ConsoleApp1.exe 1') do set CONRESULT=%%i
echo %ERRORLEVEL%
echo 결과는 원래 기댓값으로는 1이 나와야 하는데 0이 나옵니다. 어찌 보면 for 문의 복합적인 동작으로 인해 ERRORLEVEL이 전체적으로는 0이 되는 듯하지만 다음과 같은 테스트를 해보면,
ConsoleApp1.exe 1 2
for /f %%i in ('ConsoleApp1.exe 1') do set CONRESULT=%%i
echo %ERRORLEVEL%
이번엔 결과가 2가 나오는 것을 볼 수 있습니다. 왜냐하면 첫 번째 "ConsoleApp1.exe 1 2" 실행에서 2가 ERRORLEVEL로 반환되었고 이후 for 문은 ERRORLEVEL 값을 변경하지 않았기 때문입니다. (사실, for 문의 특성상 저렇게 동작하는 것이 올바르긴 합니다.) 저런 이유 때문에 콘솔 프로그램의 출력과 exit code를 함께 얻고 싶다면 for 문을 사용하면 안 되고 다음과 같은 식으로 임시 파일을 이용해야 합니다.
ConsoleApp1.exe > tmpFile.txt
echo %ERRORLEVEL%
set /p CONRESULT=<tmpFile.txt
del tmpFile.txt
echo "RESULT" %CONRESULT%
위와 같이 하면 ERRORLEVEL도 반영이 되고, 결과 값을 CONRESULT로 받아올 수 있지만 아쉽게도 이번에는 콘솔 프로그램의 출력 중 첫 번째 라인만 받아온다는 제약이 있습니다.
참고로, for 이외에도 ERRORLEVEL에 영향을 주지 않는 몇몇 명령어가 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]