#TIL #batch 확장자 bat, cmd는 어떤 차이가 있는 걸까?

cmd가 최신. 호환성을 끊고 새로운 기능을 추가하려고 bat가 아닌 새로운 확장자를 추가한 것 같다. %ERRORLEVEL% 변수 세팅 정책이 다른 건 주의해야 한다.

@ECHO off
dir __ghost__ 1>2 2>NUL
ECHO error level #1 = %errorlevel%
SET a=10
ECHO error level #2 = %errorlevel%
C:\>test.bat
error level #1 = 1
error level #2 = 1
C:\>test.cmd
error level #1 = 1
error level #2 = 0

bat 확장자 스크립트는 에러일 때만 %ERRORLEVEL% 변수에 값을 할당한다. 반면 cmd 확장자 스크립트는 에러가 아니라도 %ERRORLEVEL% 변수에 값을 할당한다.

cmd 확장자 방식이 맞는 것 같다. 바로 전 명령어 에러값을 반영하기 때문. 하지만 bash처럼 에러 발생 시 바로 리턴해버리는 set -e 명령어가 없다. 그래서 %ERRORLEVEL% 값을 처리 안 하면 계속 남아있는 bat 확장자 방식이 에러 스노우볼링 방지에 유리하다. 특히 jenkins에서 batch script 빌드 스텝을 사용한 경우.

지금은 bat 확장자 스크립트로도 아무런 불편함이 없지만, 추가 기능이 필요한 때가 올 것이다. 그때 cmd로 가느니 지금 cmd로 통일해서 간다. 주의할 점을 알았으니 가도 괜찮다.

참고 - Windows batch files: .bat vs .cmd? - stackoverflow.com

Feedback plz <3 @ohyecloudy, ohyecloudy@gmail.com

A Random Post