Batch File

개요

윈도우 커맨드라인의 순차적 명령을 처리하게끔 해주는 일종의 스크립트

문법

변수

파라메터 변수

아래와 같이 배치파일을 수행한 경우

C:\>배치파일 인자1 인자2 인자3 .. 인자9

각각 배치파일 안에서 아래와 같이 매핑이 된다.

%0 %1 %2 %3 ... %9

배치파일 자체가 %0 에 매핑되고 인자1 ~ 인자9 가 %0 ~ %9 에 대응된다.

배치파일 변수

배치파일 안에서도 자체적으로 변수를 선언하여 사용할 수 있다. 이때 시스템 환경변수를 사용한다.

REM Test변수에 hello 라는 값을 대입
SET Test=hello

REM Test변수 내용을 출력
ECHO %Test%

REM Test변수 지우기
Set Test=

보는 바와 같이 변수 양쪽이 %를 붙임으로써 참조사용이 가능하다.

그리고 아래와 같이 변수 안에 특정 character 를 다른 것으로 replace 할 수 있다.

SET Test=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
SET %Test:\=/%      // Test 변수의 내용 중 \ 를 / 로 변경한다.

위 실행 결과 Test 변수에는 C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/Tools/ 가 들어간다.

명령어

REM

주석, 설명을 의미한다.

PAUSE

실행 중 일시 정지. 아무키나 누르면 다시 진행된다.

ECHO

ECHO [문자열] - 문자열을 화면에 그대로 출력

  • ECHO ON - 이후부터 수행되는 '명령어' 를 화면에 보여준다.
  • ECHO OFF - 이후부터 수행되는 '명령어' 를 화면에 보여주지 않는다. ECHO OFF 조차도 보여주기 싫다면 앞에 @를 붙인다. @ECHO OFF
  • ECHO - 현재 ECHO ON/OFF 상태를 확인한다.

CALL

CALL [배치파일] - 다른 배치파일을 실행하고난 후 다시 현재 위치로 돌아와 다음 명령을 수행한다.

IF

IF [조건] - 조건에 따라 분기된다.

IF EXIST [파일이름] [명령] - 파일이 존재하면 명령을 수행한다.

IF NOT EXIST [파일이름] [명령] - 파일이 존재하지 않으면 명령을 수행한다.

IF EXIST *.bak DEL *.bak      // bak 확장자를 가진 파일이 존재하면 모두 지워라

IF [NOT] “문자열1” == “문자열2” [명령] - 문자열1과 문자열2가 일치(또는 불일치) 한다면 명령을 수행한다. NOT 을 빼고 != 로 바꿔서 사용 가능하다.

IF "%1" == "A" ECHO parameter1 is equal to A
IF NOT "%1" == "A" ECHO parameter1 is not equal to A

IF [NOT] ERRORLEVEL [값] [명령] - 바로 앞전에 수행되었는 프로그램이 수행을 마치며 남긴 종료코드(ExitCode)를 검사하여 값과 같으면(또는 다르면) 명령을 수행한다. 종료코드를 발생하는 명령어 (FORMAT, XCOPY, COPY, BACKUP, RESTORE 등) 들은 0~255 범위의 종료코드값을 가지는데 예를 들어 XCOPY 명령어는 수행에 성공하면 0, 파일이 없을 때 1, Ctrl+C 로 중단될 경우 2, 초기화 오류발생 때는 4, 디스크 에러에는 5를 반환하는 식으로 정해져있다.(도스명령어 메뉴얼 참고)

XCOPY %1 c:\temp
IF NOT ERRORLEVEL 0 ECHO copy failed..
IF ERRORLEVEL 0 ECHO copy successfully!

GOTO

GOTO [레이블이름] - 레이블 이름으로 점프한다. 레이블은 8자 이내로 맨 앞에 콜론(:) 이 붙는 형태이다.

IF NOT EXIST *.bak GOTO _FAIL_
MOVE /-Y *.bak c:\temp
ECHO backup file moved.
GOTO _END_
:_FIRST_
ECHO *.bak file not found!
:_END_

SHIFT

SHIFT 는 위에 설명했던 '파라메터 변수'를 10개 이상 사용하고자할 때 활용할 수 있는 수단으로 파라메터 값들을 차례로 좌측으로 쉬프트한다.

C:\>copy con test.bat
@ECHO OFF
:_BEGIN_
IF "%1" == "" GOTO _END_
TYPE %1
SHIFT
GOTO _BEGIN_
:_END_
ECHO no more file.
^Z

test.bat a.txt b.txt c.txt … z.txt 를 수행할 경우 a ~ z 텍스트파일의 내용을 모두 출력한 후 “no more file.” 이란 메세지를 출력하고 종료한다. 첫번째 루프에 a.txt 가 %1 이 되고 SHIFT 가 된 후에는 b.txt 가 %1 이 되는 원리이다.

FOR

FOR 변수 IN (세트) DO [명령어] 변수

  • '세트'는 다수의 파일들이 뭉친 세트를 의미하고 %%변수 는 세트에 있는 파일들이 순차적으로 설정되는 값이다.
  • '세트' 는 와일드카드문자(*,?) 를 사용할 수 있다.
FOR %%Z IN (*.BAT *.DOC *.TXT) DO TYPE %%Z

위 예는 현재 디렉토리의 모든 bat, doc, txt 파일을 출력하라는 내용이다.

활용

  • 시간/날짜를 이용해 파일 및 폴더 만들기
    REM 날짜를 CurData 변수에 Year-Month-Day 포멧으로 조합
    for /f "tokens=1-5 delims=-" %%d in ("%DATE%") do SET CurDate=%%d-%%e-%%f
    
    REM 시간을 CurTime 변수에 [Hour-Minute-Second] 포멧으로 조합
    for /f "tokens=1-5 delims=-" %%d in ("%TIME%") do SET CurTime=[%%d-%%e-%%f]

참조