윈도우 배치파일을 이용하여 코드 백업 프로그램 만들기
우리 사무실 막내는 매일 매일 코드를 백업해야 한다. 내가 바로 그 막내다.
시간도 오래걸리고(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)