Saturday, July 15, 2006
[배치 파일] 프로그램 실행의 성공 여부를 Error Level 로 확인/판단하기: ERRORLEVEL
윈도우의 명령 프롬프트(일명 도스창) 상에서, 어떤 프로그램이나 명령어를 실행시킬 때, 그 프로그램이 성공적으로 끝나면, 그 프로그램은 정수 0 (제로) 을 OS에 반환하며 끝냅니다. 만약 실패하거나 문제가 있을 때에는 0 이 아닌 값, 대체로 정수 1 을 반환하며 끝냅니다. 좀더 특수한 문제가 생긴다면, 프로그래머의 마음에 따라 2, 3, 255 등을 반환할 수도 있습니다. 이것을 에러 레벨 (Error Level) 이라고 합니다. 에러 코드 / 탈출 코드 (Exit Code) 라고 부를 수도 있습니다.
그런데 에러 레벨 (Error Level)은 눈에 보이지도 않고, OS가 사용자에게 알려주지도 않습니다.
그러나 윈도우에서 이것을 보는 방법이 있습니다. %ERRORLEVEL% 이라는 암묵적인 환경 변수 안에, 최근에 종료된 프로그램/명령어가 돌려준 값이 들어 있습니다.
echo %ERRORLEVEL%
이런 명령으로 그 값을 볼 수가 있습니다. (윈도98에서는 안되고, 윈도2000/XP 이상에서만 됨.) 그렇지만 이렇게 긴 명령어를 항상 타이핑해 줄 수는 없기에 다음과 같은 짧은 배치 파일을 만들어, el.bat 등의 이름으로 저장해서, 패스(Path)가 걸린 폴더에 넣어두면 편리합니다.
이제, 어떤 프로그램의 실행이 종료된 직후, el 이라고 치면, 그 프로그램의 에러 레벨이 화면이 나옵니다. 아무 문제 없이 끝났다면 0 이고, 문제가 있다면 0이 아닙니다. (물론 문제가 있어도 에러 레벨을 반환하지 않는 프로그램도 있는데, 이때도 0이 나오긴 합니다.)
명령프롬프트에서, dir 이라고 친 후, el 이라고 칩니다. (el 은 위에서 만든 배치입니다.) 그러면 화면에 0 이라는 숫자가 하나 나올 것입니다. dir 이 에러 없이 종료되었기에, dir 이 0 이라는 값을 반환하고 끝낸 것입니다.
이제 dir ddddddd 이렇게 쳐봅니다. 여러분의 하드에 ddddddd 이런 이름을 가진 파일이나 폴더는 없을 것입니다. 따라서 에러가 납니다. 이제 다시 el 이라고 칩니다. 그러면 1 이라는 숫자가 나타날 것입니다. dir이 파일을 찾지 못했기에 즉 에러가 났기에 1이라는 값을 반환하고 끝낸 흔적입니다. 다른 종류의 에러가 났다면 다른 숫자가 나올 수도 있습니다. 아무튼 에러가 나면, 0이 아닌 정수의 값을 반환합니다.
만약 wty4yjrrkrktrk24743.txt 라는 파일이 없으면 에러를 내고 배치 파일을 종료하고, 만약 있다면 그 파일을 dir 로 출력하는 예제입니다.
if not "%ERRORLEVEL%" == "0" goto ERROR
이 코드가 핵심입니다. %ERRORLEVEL%이 0이 아니라면 에러가 난 것이기에, 에러 메시지를 출력하는 부분으로 점프하라는 것입니다. 만약 0이라면 에러가 나지 않았다는 의미이기에, 이 조건문은 다음 줄로 무사통과입니다.
여러분의 현재 디렉토리에 wty4yjrrkrktrk24743.txt 라는 이름의 파일이 없을 것입니다. 그래서 이 배치 파일을 실행시키면, "그런 파일이 없군요! -_-;" 라는 에러 메시지가 나옵니다.
만약 wty4yjrrkrktrk24743.txt 라는 파일을 만들어 준다면 "파일이 있어요 +_+)/" 라는 메시지가 나올 것입니다.
※ 단, 윈도98에서는 echo %ERRORLEVEL% 이 작동하지 않습니다. 윈도2000 이상의 OS에서만 됩니다.
중요하거나 위험한 일을 하는 배치 파일에서는, 앞줄에서 실행시킨 명령어의 성공 여부를 %ERRORLEVEL% 을 사용해 면밀히 체크한 후, 다음줄의 명령을 실행해야 합니다. 이것은 그런 체크를 하는 예제입니다.
▶▶ 배치파일] 탈출코드(에러레벨;반환값) 강제로 설정하기 - ERRORLEVEL, Exit Code, Batch File
그런데 에러 레벨 (Error Level)은 눈에 보이지도 않고, OS가 사용자에게 알려주지도 않습니다.
그러나 윈도우에서 이것을 보는 방법이 있습니다. %ERRORLEVEL% 이라는 암묵적인 환경 변수 안에, 최근에 종료된 프로그램/명령어가 돌려준 값이 들어 있습니다.
echo %ERRORLEVEL%
이런 명령으로 그 값을 볼 수가 있습니다. (윈도98에서는 안되고, 윈도2000/XP 이상에서만 됨.) 그렇지만 이렇게 긴 명령어를 항상 타이핑해 줄 수는 없기에 다음과 같은 짧은 배치 파일을 만들어, el.bat 등의 이름으로 저장해서, 패스(Path)가 걸린 폴더에 넣어두면 편리합니다.
@echo off
echo %ERRORLEVEL%
echo %ERRORLEVEL%
이제, 어떤 프로그램의 실행이 종료된 직후, el 이라고 치면, 그 프로그램의 에러 레벨이 화면이 나옵니다. 아무 문제 없이 끝났다면 0 이고, 문제가 있다면 0이 아닙니다. (물론 문제가 있어도 에러 레벨을 반환하지 않는 프로그램도 있는데, 이때도 0이 나오긴 합니다.)
el.bat 의 실제 사용법
명령프롬프트에서, dir 이라고 친 후, el 이라고 칩니다. (el 은 위에서 만든 배치입니다.) 그러면 화면에 0 이라는 숫자가 하나 나올 것입니다. dir 이 에러 없이 종료되었기에, dir 이 0 이라는 값을 반환하고 끝낸 것입니다.
이제 dir ddddddd 이렇게 쳐봅니다. 여러분의 하드에 ddddddd 이런 이름을 가진 파일이나 폴더는 없을 것입니다. 따라서 에러가 납니다. 이제 다시 el 이라고 칩니다. 그러면 1 이라는 숫자가 나타날 것입니다. dir이 파일을 찾지 못했기에 즉 에러가 났기에 1이라는 값을 반환하고 끝낸 흔적입니다. 다른 종류의 에러가 났다면 다른 숫자가 나올 수도 있습니다. 아무튼 에러가 나면, 0이 아닌 정수의 값을 반환합니다.
D:\Z>dir
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
2006-07-15 11:53a <DIR> .
2006-07-15 11:53a <DIR> ..
2006-07-15 11:52a 217 0.bat
1개 파일 217 바이트
2 디렉터리 54,970,830,848 바이트 남음
D:\Z>el
0
D:\Z>dir ddddddd
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
파일을 찾을 수 없습니다.
D:\Z>el
1
D:\Z>
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
2006-07-15 11:53a <DIR> .
2006-07-15 11:53a <DIR> ..
2006-07-15 11:52a 217 0.bat
1개 파일 217 바이트
2 디렉터리 54,970,830,848 바이트 남음
D:\Z>el
0
D:\Z>dir ddddddd
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
파일을 찾을 수 없습니다.
D:\Z>el
1
D:\Z>
배치 파일 안에서 ERRORLEVEL 활용
만약 wty4yjrrkrktrk24743.txt 라는 파일이 없으면 에러를 내고 배치 파일을 종료하고, 만약 있다면 그 파일을 dir 로 출력하는 예제입니다.
if not "%ERRORLEVEL%" == "0" goto ERROR
이 코드가 핵심입니다. %ERRORLEVEL%이 0이 아니라면 에러가 난 것이기에, 에러 메시지를 출력하는 부분으로 점프하라는 것입니다. 만약 0이라면 에러가 나지 않았다는 의미이기에, 이 조건문은 다음 줄로 무사통과입니다.
@echo off
dir wty4yjrrkrktrk24743.txt
if not "%ERRORLEVEL%" == "0" goto ERROR
goto OK
:ERROR
echo 그런 파일이 없군요! -_-;
goto QUIT
:OK
echo 파일이 있어요 +_+)/
goto QUIT
:QUIT
dir wty4yjrrkrktrk24743.txt
if not "%ERRORLEVEL%" == "0" goto ERROR
goto OK
:ERROR
echo 그런 파일이 없군요! -_-;
goto QUIT
:OK
echo 파일이 있어요 +_+)/
goto QUIT
:QUIT
wty4yjrrkrktrk24743.txt 파일이 없을 때와 있을 때의 실행 결과:
D:\Z>0.bat
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
파일을 찾을 수 없습니다.
그런 파일이 없군요! -_-;
D:\Z>0.bat
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
2006-07-15 11:36a 82 wty4yjrrkrktrk24743.txt
1개 파일 82 바이트
0 디렉터리 54,970,830,848 바이트 남음
파일이 있어요 +_+)/
D:\Z>
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
파일을 찾을 수 없습니다.
그런 파일이 없군요! -_-;
D:\Z>0.bat
D 드라이브의 볼륨: Foo
볼륨 일련 번호: 3894-A721
D:\Z 디렉터리
2006-07-15 11:36a 82 wty4yjrrkrktrk24743.txt
1개 파일 82 바이트
0 디렉터리 54,970,830,848 바이트 남음
파일이 있어요 +_+)/
D:\Z>
여러분의 현재 디렉토리에 wty4yjrrkrktrk24743.txt 라는 이름의 파일이 없을 것입니다. 그래서 이 배치 파일을 실행시키면, "그런 파일이 없군요! -_-;" 라는 에러 메시지가 나옵니다.
만약 wty4yjrrkrktrk24743.txt 라는 파일을 만들어 준다면 "파일이 있어요 +_+)/" 라는 메시지가 나올 것입니다.
※ 단, 윈도98에서는 echo %ERRORLEVEL% 이 작동하지 않습니다. 윈도2000 이상의 OS에서만 됩니다.
결론
중요하거나 위험한 일을 하는 배치 파일에서는, 앞줄에서 실행시킨 명령어의 성공 여부를 %ERRORLEVEL% 을 사용해 면밀히 체크한 후, 다음줄의 명령을 실행해야 합니다. 이것은 그런 체크를 하는 예제입니다.
▶▶ 배치파일] 탈출코드(에러레벨;반환값) 강제로 설정하기 - ERRORLEVEL, Exit Code, Batch File
tag: batch
배치파일 | DOS CMD BATCH .BAT | VBScript .VBS
<< Home