본문으로 바로가기



안녕하세요 배치파일 의 최종버전 입니다. 


아직 배치파일 만들기와 문법에 익숙하지 않는 분들은 


[IT/Windows] - 배치파일 만들기/bat 파일 만들기


[IT/Windows] - 배치파일 명령어/배치파일 명령어모음


[IT/Windows] - 배치파일/연산자/쉘 스크립트 동의어/장치 연산자


확인 하시면 됩니다. 



서버 혹은 자료를 데일리백업 즉 일일 백업을 할경우 

덮어 쓰는 방법도 있지만, 해당 데이터의 기록을 남기기 위하여 

해당 일자의 폴더를 만들어 백업을 하는 경우가 있습니다. 

그럼 간단하게  date -1 해서 폴더를 생성 하면 될듯 하지만 

현실은 그렇지 않습니다. 



이유는 2월 이라는 변수가 우리에게는 있기 때문이죠

2월은 26일인 날부터 28일인 날까지 매년 변동이 있기 때문에 

배치파일 을 통한 백업을 자동화 시키는 마당에 

매년 새로이 배치파일을 만들수는 없기 때문이죠 


그래서 다음과 같은 배치파일을 만들어야 합니다. 



@ECHO OFF


IF NOT "%OS%"=="Windows_NT" GOTO Syntax


IF NOT [%1]==[] GOTO Syntax


SETLOCAL ENABLEDELAYEDEXPANSION


CALL :DateFormat


IF %iDate%==0 FOR /F "TOKENS=1-4* DELIMS=%sDate%" %%A IN ('DATE/T') DO (

SET LocalFormat=MM%sDate%DD%sDate%YYYY

SET tLocal=%%tMonth%%%sDate%%%tDay%%%sDate%%%tYear%%

SET yLocal=%%yMonth%%%sDate%%%yDay%%%sDate%%%yYear%%

SET Year=%%C

SET Month=%%A

SET Day=%%B

)

IF %iDate%==1 FOR /F "TOKENS=1-4* DELIMS=%sDate%" %%A IN ('DATE/T') DO (

SET LocalFormat=DD%sDate%MM%sDate%YYYY

SET tLocal=%%tDay%%%sDate%%%tMonth%%%sDate%%%tYear%%

SET yLocal=%%yDay%%%sDate%%%yMonth%%%sDate%%%yYear%%

SET Year=%%C

SET Month=%%B

SET Day=%%A

)

IF %iDate%==2 FOR /F "TOKENS=1-4* DELIMS=%sDate%" %%A IN ('DATE/T') DO (

SET LocalFormat=YYYY%sDate%MM%sDate%DD

SET tLocal=%%tYear%%%sDate%%%tMonth%%%sDate%%%tDay%%

SET yLocal=%%yYear%%%sDate%%%yMonth%%%sDate%%%yDay%%

SET Year=%%A

SET Month=%%B

SET Day=%%C

)


FOR %%A IN (%Year%)  DO SET Year=%%A

FOR %%A IN (%Month%) DO SET Month=%%A

FOR %%A IN (%Day%)   DO SET Day=%%A


SET SortDate=%Year%%Month%%Day%


FOR %%A IN (%Date%) DO SET Today=%%A


IF   "%Day:~0,1%"=="0" SET   Day=%Day:~1%

IF "%Month:~0,1%"=="0" SET Month=%Month:~1%


CALL :JDate %Year% %Month% %Day%

SET /A JDate -= 1

CALL :GDate %JDate%

FOR /F "tokens=1-3" %%A IN ('ECHO %GDate%') DO (

SET yYear=%%A

SET yMonth=%%B

SET yDay=%%C

)


SET /A JDate += 2

CALL :GDate %JDate%

FOR /F "tokens=1-3" %%A IN ('ECHO %GDate%') DO (

SET tYear=%%A

SET tMonth=%%B

SET tDay=%%C

)



IF 1%tDay%   LSS 20 SET tDay=0%tDay%

IF 1%yDay%   LSS 20 SET yDay=0%yDay%

IF 1%tMonth% LSS 20 SET tMonth=0%tMonth%

IF 1%yMonth% LSS 20 SET yMonth=0%yMonth%


SET SortTom=%tYear%%tMonth%%tDay%

SET SortYest=%yYear%%yMonth%%yDay%

SET yyyy=%yYear%

SET mm=%yMonth%

SET dd=%yDay%

SET dt=%yyyy%-%mm%-%dd%


IF NOT EXIST "\\123.456.78.9\L\log\security\%dt%\" MD "\\123.456.78.9\L\log\security\%dt%\"  

rem : 원본데이터 및 폴더 생성할 경로 설정 


cd "\\123.456.78.9\L\log\security\%date:~10,4%-%date:~4,2%\" 

rem : 생성 폴더 확인 및 폴더 로의 이동 

rem : %date:~10,4%-%date:~4,2% : xxxx.xx.xx 중에 해당 월 일 의 데이터만 추려 오는 함수 


xcopy /Y "C:\Security-%dt%-*.*" ""\\123.456.78.9\L\log\security\%dt%\""

rem : 해당 데이터를 xcopy 로 복사 


:: ENDLOCAL&SET Yesterday=%SortYest%&SET Today=%SortDate%&SET Tomorrow=%SortTom%

:: GOTO:EOF


:DateFormat

REG.EXE /? 2>&1 | FIND "REG QUERY" >NUL

IF ERRORLEVEL 1 (

CALL :DateFormatRegEdit

) ELSE (

CALL :DateFormatReg

)

GOTO:EOF



:DateFormatReg

FOR /F "tokens=1-3" %%A IN ('REG Query "HKCU\Control Panel\International" ^| FINDSTR /R /C:"[is]Date"') DO (

IF "%%~A"=="REG_SZ" (

SET %%~B=%%~C

) ELSE (

SET %%~A=%%~C

)

)

GOTO:EOF



:DateFormatRegEdit

START /W REGEDIT /E %TEMP%.\_TEMP.REG "HKEY_CURRENT_USER\Control Panel\International"

FOR /F "tokens=1* delims==" %%A IN ('TYPE %TEMP%.\_TEMP.REG ^| FIND /I "iDate"') DO SET iDate=%%B

FOR /F "tokens=1* delims==" %%A IN ('TYPE %TEMP%.\_TEMP.REG ^| FIND /I "sDate"') DO SET sDate=%%B

DEL %TEMP%.\_TEMP.REG

SET iDate=%iDate:"=%

SET sDate=%sDate:"=%

GOTO:EOF



:GDate

SET /A P      = %1 + 68569

SET /A Q      = 4 * %P% / 146097

SET /A R      = %P% - ( 146097 * %Q% +3 ) / 4

SET /A S      = 4000 * ( %R% + 1 ) / 1461001

SET /A T      = %R% - 1461 * %S% / 4 + 31

SET /A U      = 80 * %T% / 2447

SET /A V      = %U% / 11

SET /A GYear  = 100 * ( %Q% - 49 ) + %S% + %V%

SET /A GMonth = %U% + 2 - 12 * %V%

SET /A GDay   = %T% - 2447 * %U% / 80


FOR %%A IN (P Q R S T U V) DO SET %%A=


IF 1%GMonth% LSS 20 SET GMonth=0%GMonth%

IF 1%GDay%   LSS 20 SET GDay=0%GDay%


SET GDate=%GYear% %GMonth% %GDay%

GOTO:EOF



:JDate

SET /A Month1 = ( %2 - 14 ) / 12

SET /A Year1  = %1 + 4800

SET /A JDate  = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( %2 - 2 -12 * %Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + %3 - 32075

FOR %%A IN (Month1 Year1) DO SET %%A=

GOTO:EOF



:UpCase

SET UpCase=%1

SET UpCase=%UpCase:a=A%

SET UpCase=%UpCase:b=B%

SET UpCase=%UpCase:c=C%

SET UpCase=%UpCase:d=D%

SET UpCase=%UpCase:e=E%

SET UpCase=%UpCase:f=F%

SET UpCase=%UpCase:g=G%

SET UpCase=%UpCase:h=H%

SET UpCase=%UpCase:i=I%

SET UpCase=%UpCase:j=J%

SET UpCase=%UpCase:k=K%

SET UpCase=%UpCase:l=L%

SET UpCase=%UpCase:m=M%

SET UpCase=%UpCase:n=N%

SET UpCase=%UpCase:o=O%

SET UpCase=%UpCase:p=P%

SET UpCase=%UpCase:q=Q%

SET UpCase=%UpCase:r=R%

SET UpCase=%UpCase:s=S%

SET UpCase=%UpCase:t=T%

SET UpCase=%UpCase:u=U%

SET UpCase=%UpCase:v=V%

SET UpCase=%UpCase:w=W%

SET UpCase=%UpCase:x=X%

SET UpCase=%UpCase:y=Y%

SET UpCase=%UpCase:z=Z%

GOTO:EOF



:Syntax

IF     "%OS%"=="Windows_NT" CALL :UpCase %~n0

IF     "%OS%"=="Windows_NT" ECHO Usage:  %UpCase%

IF NOT "%OS%"=="Windows_NT" ECHO Usage:  %0




위와 같은 파일을 작성 해서 배치파일을 실행 시켜 주시면 됩니다. 

여기 안에 있는 내용들만 수정해서요

중간에 있는 set 함수를 사용하여 선언 해준 내용들도 본인의 설정 혹은 상황에 맞게 

변경 해주시면 됩니다. 


참고로 위 bat 함수는 영문 윈도우 에서 사용하기 위하여 작성 되었습니다. 

윈도우 가 한글인 윈도우에서는%date:~10,4%-%date:~4,2%  이부분을 꼭 변경 해주셔야 합니다. 

영문 윈도우 에서는 dd-mm-yyyy 형식으로 나오기 때문에 위와 같이 날자를 잘라서 사용 하였지만, 

한글 윈도우에서는 YYYY-MM-DD 형식이기에 본인이 원하는 날자대로 안나올수 있습니다. 



배치파일 통한 일일 백업과 폴더 자동생성은 분명히 편안한 작업임에는 틀림없습니다. 

하지만, 배치 파일을 적용 시키기 이전에 먼저 테스트를 하는 습관은 필수 이며, 

파일이 잘돌아 갔는지에 대한 로그 확인 또한 필수 입니다. 


자신의 작업에 대한 확신과 믿음은 좋으나, 과신하지는 않기바랍니다. 


감사합니다.