본문 바로가기

카테고리 없음

윈도우 배치파일을 이용하여 코드 백업 프로그램 만들기

우리 사무실 막내는 매일 매일 코드를 백업해야 한다. 내가 바로 그 막내다.

시간도 오래걸리고(5분..?ㅎ) 너무 귀찮아서 몇 번 빼먹고 나니 도무지 나를 믿을 수 없었다.

그래서 백업 프로그램을 만들기로 했다.

윈도우 배치파일을 만들어 본 적이 없어, 백업 프로그램에 사용될 만한 명령어들을 간략하게 정리 해가며 만들었다. 

나도 처음 만든것이기 때문에 내 글을 읽다보면 백업 프로그램을 쉽게 만들 수 있을것이라 기대해본다..

유닉스의 명령어와 비슷하면서 달라서 약간 헷갈릴 수 있으나 그다지 어렵지 않으니 후딱 따라해보면 익숙해질것이다.

 

<배치 파일 만들기>

  1. 텍스트 에디터를 켜서 배치 파일 명령어를 작성한다. (나는 메모장을 이용했다.)

  2. 파일 이름 : [파일명].bat / 파일 형식 : 모든 파일(*.*)

 

<배치 파일 기본 명령어>

 **각각의 명령어들을 잘 이해하기 위해서 cmd 창에서 직접 쳐보는것을 추천한다. (win + r, cmd 입력하여 실행) 

 HELP [명령어]

  - 파라미터 X :: 전체 명령어들에 대한 간략한 설명 (아래 설명들은 해당 메뉴를 참고하여 작성함)

  - 파라미터 0 :: [명렁어]에 대한 자세한 설명

 [명령어] /?

  - 모든 명령어는 /?옵션을 파라미터로 받을 수 있다.

  - HELP [명령어]와 같음

 

 ECHO ON

  - ECHO 설정 ON (실행되는 명령어가 다 보임)

 ECHO OFF

  - ECHO 설정 OFF (실행되는 명령어가 안 보임)

 ECHO [옵션] [메세지]

  - 메세지가 있으면 메세지 출력(ECHO OFF 상태여도), 없으면 현재 ECHO 설정 표시

  - -n옵션 :: 문자열 마지막의 개행문자(new line)를 출력하지 않음

  - -e옵션 :: 문자열에서 이스케이프(escape)문자 인식

 

 TITLE [문자열]

  - 배치 파일이 실행되는 명령 프롬프트의 창 제목을 [문자열]로 지정

 

 RES [주석문]

  - 주석, 프로그램에 아무런 영향을 끼치지 않음

  - ::[주석문]과 같음

 

 CLS

  - 화면 지우기

 

 PAUSE

  - 일시정지 + 화면에 "계속하려면 아무 키나 누르십시오..."라고 뜸

  - 보통 배치파일 작성하고 실행시키면, 명령어들이 모두 실행되고 자동 종료된다. 이를 막기 위한 명령어.

  - ECHO와 함께 사용하면 디버깅할 때 용이함

 

 DATE [옵션]

  - 날짜를 보여주거나 설정

  - /T :: 새 날짜를 묻지 않고 현재 날짜를 출력

 

 CD [경로]

  - 파라미터 X :: 현재 위치 출력

  - 파라미터 0 :: 해당 경로로 이동

 

 MD [폴더명]

  - 폴더 생성

  - MKDIR [폴더명]과 같다

 

 ROBOCOPY [원본] [대상] [파일1 [파일2]...] [옵션]

  - 원본 디렉토리의 파일들을 대상 디렉토리에 복사, 파일 이름/와일드카드의 기본값은 *.*

  - 복사 옵션

    - /S :: 비어있는 디렉토리 제외하고 하위 디렉토리 복사

    - /E :: 비어있는 디렉토리 포함하여 하위 디렉토리 복사

    - /MON:n :: 원본을 모니터링함. n개 이상의 변경 내용이 표시된 경우 다시 실행 
    - /MOT:m :: 원본을 모니터링함. 변경 내용이 있으면 m분 후에 다시 실행

    - /DCOPY:copyflag[s] :: 디렉터리에 대해 복사할 내용(기본값은 /DCOPY:DA)
                       (copyflags : D=데이터, A=특성, T=타임스탬프)
    - /NODCOPY :: 디렉터리 정보 복사 안 함(기본적으로 /DCOPY:DA 수행)

  - 파일 선택 옵션

    - /XF file [file]... :: 지정된 이름/경로/와일드카드와 일치하는 파일을 제외
    - /XD dirs [dirs]... :: 지정된 이름/경로와 일치하는 디렉터리를 제외

 - 다시 시도 옵션

    -  /R:n :: 실패한 복사본에 대한 다시 시도 횟수. 기본값은 1백만
    - /W:n :: 다시 시도 간 대기 시간. 기본값은 30초

 

 - 로깅 옵션

    - /ETA :: 복사하는 파일의 예상 도착 시간을 표시

    - /LOG:file :: 상태를 로그 파일에 출력. 기존 로그를 덮어씀
    - /LOG+:file :: 상태를 로그 파일에 출력. 기존 로그에 추가

 

 

<배치 파일 기본 함수/변수>

 - 인수 사용 

    - %[1~9사이의 숫자n] :: n번째 인수를 저장하는 변수

 - ERRORLEVEL

    - 0 :: 오류 발생 안함

    - 1이상 :: 오류 발생

 - SET [변수=[문자열]]

    - 파라미터 X :: 현재 환경 변수 출력

    - SET 변수 :: 입력받은 변수로 시작하는 모든 변수 표시 / 해당 변수를 찾을 수 없으면 ERRORLEVEL을 1으로 설정

    - SET 변수 = [문자열] :: 입력받은 변수에 문자열을 입력

 -IF...ELSE 함수

  - IF [NOT] ERRORLEVEL [숫자] [명령어]

     - ERRORLEVEL이 [숫자] 이면 [명령어]실행

  - IF [NOT] [문자열1 == 문자열2] [명령어]

     - 문자열1이 문자열2와 일치하면 [명령어]실행

  - IF [NOT] EXIST [파일 이름] [명령어]

     - 이름이 [파일 이름]인 파일이 존재하면 [명령어]실행

  - ELSE 명령어는 IF 명령의 마지막과 동일한 행에 위치해야 함 - 괄호를 쓰는것이 프로그램을 깔끔하게 짤 수 있음

 

<요구사항 정의>

1. 백업 담당자가 프로그램 실행하여 백업

2. BACKUP폴더에 오늘 날짜 폴더를 만들고 프로젝트 폴더 백업

3. SVNRepo폴더의 상위 폴더를 복사할때는 SVNRepo폴더를 제외하고 복사

5. 백업 작업 내역 로그 남기기

 

<배치 파일>

:: 이미 명령어에 대한 설명은 위에 있어 따로 주석을 달지 않았다.

:: 혹시 이해가 안가는 부분을 댓글 달아주면 발견하는 대로 설명을 추가하겠다!

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 코드를 백업하는 배치 파일
::
:: 이미 폴더가 있으면 프로그램 중단

::

:: D드라이브 안의 projectA, projectB, projectC를 D:\BACKUP에 폴더 이름이 오늘 날짜인 폴더를 만들고 그 안에 백업
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

ECHO OFF


TITLE BACKUP PROGRAM


CD D:\BACKUP
SET FILE_NAME=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

IF EXIST %FILE_NAME% (
    ECHO 이름이 '%FILE_NAME%'인 폴더가 이미 있습니다. 
    ECHO 백업을 종료합니다.
    PAUSE
    EXIT
) ELSE (
    MD %FILE_NAME%
)

CD %FILE_NAME%

MD projectA
MD projectB
MD projectC

ROBOCOPY D:\projectA D:\BACKUP\%FILE_NAME%\projectA /E /ETA /XD dirs SVNRepo /XD dirs svnrepo /LOG+:D:\BACKUP\log\%FILE_NAME%.log
ROBOCOPY D:\projectB D:\BACKUP\%FILE_NAME%\projectB /E /ETA /XD dirs SVNRepo /XD dirs svnrepo /LOG+:D:\BACKUP\log\%FILE_NAME%.log
ROBOCOPY D:\projectC D:\BACKUP\%FILE_NAME%\projectC /E /ETA /XD dirs SVNRepo /XD dirs svnrepo /LOG+:D:\BACKUP\log\%FILE_NAME%.log

 

PAUSE

 

참고 1 : https://www.snoopybox.co.kr/1404

참고 2 : https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490869(v=technet.10)