배치파일에서 오늘 날짜를 구하는 방법은 상당히 간단하다. date라는 명령을 이용해서 구할 수도 있지만 간단히%DATE%라는 환경 변수를 이용해서 구할 수도 있다. 물론 %DATE% 환경 변수는 모든 시스템에서 사용할 수 있는 것은 아니다. 그러나 XP 기반의 OS에서는 모두 사용할 수 있으므로 큰 문제는 없다고 본다. 명령행에서
명령을 실행해보면 알 수 있지만 %DATE%는 YYYY-MM-DD 형태로 날짜를 출력한다. 만약 출력되는 날짜 형식을 변경하고 싶다면 다음과 같은 간단한 배치 파일로 이 문제를 해결할 수 있다.
만약 배치 파일에서 어제나 내일의 날짜를 구하고 싶은 경우에는 어떻게 할까? %DD%에서 하루만 빼면 될 것 같지만 사실 그리 간단하지는 않다. 생각해보면 쉽다. 오늘 날짜가 2월 2일이라면 %DD%에서 하루만 빼면된다. 그러나 2월 1일이라면 어제는 1월 31일이므로 %MM%에서도 1를 빼야한다. 만약 1월 1일이라면 어떻게 될까? 이때는 %DD%, %MM%, %YY%에서 1을 빼야한다.
더우기 이렇게 계산해도 오류가 발생한다. 그 이유는 3월 1일을 생각해보면 쉽다. 3월 1일에서 하루를 빼면 2월 28일이 되지만 4년 마다 한번씩 2월 29일이된다. 즉 윤년까지 계산해야 한다는 점이다. 따라서 배치파일에서 어제의 날짜를 계산하는 것은 조금 복잡한 과정을 거쳐야 한다. 다음 어제의 날짜를 계산하는 배치 파일이다.
따라서 이러한 문제를 피하고 %DD%와 %MM%에서 선행되는 0을 제거하기위해 1%DD%-101과 1%MM%-100을 사용한 것이다. 여기서 /a는 계산된 결과를 의미한다. 즉 %DD%가 02이라면 윗식은 102-101=1이므로 최종적으로 %DD%에는 0이 제거된 1이라는 값이 저장된다. %DD%의 경우 101을 빼지만 %MM%에서는 100을 뺀다. 그 이유는 어제의 날짜를 계산하기위해서는 %DD%에서는 1을 빼야하지만 %MM%의 경우 단지 선행되는 0만 제거하면 되기때문이다.
echo %DATE%
명령을 실행해보면 알 수 있지만 %DATE%는 YYYY-MM-DD 형태로 날짜를 출력한다. 만약 출력되는 날짜 형식을 변경하고 싶다면 다음과 같은 간단한 배치 파일로 이 문제를 해결할 수 있다.
[today.cmd]
@echo offfor /f "tokens=1-3 delims=- " %%A in ('echo %DATE%') do (set YY=%%A&SET MM=%%B&SET DD=%%C)
echo %YY%, %MM%, %DD%
만약 배치 파일에서 어제나 내일의 날짜를 구하고 싶은 경우에는 어떻게 할까? %DD%에서 하루만 빼면 될 것 같지만 사실 그리 간단하지는 않다. 생각해보면 쉽다. 오늘 날짜가 2월 2일이라면 %DD%에서 하루만 빼면된다. 그러나 2월 1일이라면 어제는 1월 31일이므로 %MM%에서도 1를 빼야한다. 만약 1월 1일이라면 어떻게 될까? 이때는 %DD%, %MM%, %YY%에서 1을 빼야한다.
더우기 이렇게 계산해도 오류가 발생한다. 그 이유는 3월 1일을 생각해보면 쉽다. 3월 1일에서 하루를 빼면 2월 28일이 되지만 4년 마다 한번씩 2월 29일이된다. 즉 윤년까지 계산해야 한다는 점이다. 따라서 배치파일에서 어제의 날짜를 계산하는 것은 조금 복잡한 과정을 거쳐야 한다. 다음 어제의 날짜를 계산하는 배치 파일이다.
[yesterday.cmd]
@echo offfor /f "tokens=1-3 delims=- " %%A in ('echo %DATE%') do (set YY=%%A&SET MM=%%B&SET DD=%%C)
set /a DD=1%DD%-101set /a MM=1%MM%-100
if %DD% GTR 0 goto endset /a MM=%MM%-1
if %MM% GTR 0 goto leap
set /a DD=31set /a MM=12set /a YY=%YY%-1REM echo %YY%, %MM%, %DD% -> 2005, 12, 31goto end
:leapset /a TT=%YY%/4set /a TT=%TT%*4if not %YY% equ %TT% goto mon%MM%set /a DD=29goto end
:mon1:mon3:mon5:mon7:mon8:mon10set /a DD=31goto end
:mon2set /a DD=28goto end
:mon4:mon6:mon9:mon11set /a DD=30goto end
:endset /a DD=%DD% + 100set DD=%DD:~1,2%set /a MM=%MM% + 100set MM=%MM:~1,2%
echo %YY%, %MM%, %DD%
for /f "tokens=1-3 delims=- " %%A in ('echo %DATE%') do (set YY=%%A&SET MM=%%B&SET DD=%%C)%DATE% 환경 변수에서 년월일을 %YY%, %MM%, %DD%로 분리하는 루틴이다. echo %DATE%를 실행한 결과를 tokens과 delims를 이용해서 %%A, %%B, %%C로 저장하고 이 값을 다시 %YY%, %MM%, %DD%로 저장하는 순환문이다.
set /a DD=1%DD%-101set /a MM=1%MM%-100조금 이해가 가지 않는 문장일 수 있다. 사실 set 명령을 이용하면 간단한 사칙 연산이 가능해진다. 그런데 문제는 %DD%나 %MM%은 01, 02처럼 숫자앞에 0이 추가될 수 있다. 이 경우 %DD%-1과 같은 방법으로 연산을 수행하면 숫자로 처리되지 않고 문자로 처리되기 때문에 1을 빼는 것이 아니라 한 문자를 삭제하게된다. 한 예로 %DD%가 01이고 이 상태에서 %DD%-1을 수행하면 그 결과는 0이된다. 다음 내용을 test.cmd로 저장한 후 그 결과를 시험해보면 쉽게 알 수 있다.
@echo offset DD=01set /a DD=%DD%-1echo %DD%
따라서 이러한 문제를 피하고 %DD%와 %MM%에서 선행되는 0을 제거하기위해 1%DD%-101과 1%MM%-100을 사용한 것이다. 여기서 /a는 계산된 결과를 의미한다. 즉 %DD%가 02이라면 윗식은 102-101=1이므로 최종적으로 %DD%에는 0이 제거된 1이라는 값이 저장된다. %DD%의 경우 101을 빼지만 %MM%에서는 100을 뺀다. 그 이유는 어제의 날짜를 계산하기위해서는 %DD%에서는 1을 빼야하지만 %MM%의 경우 단지 선행되는 0만 제거하면 되기때문이다.
if %DD% GTR 0 goto endset /a MM=%MM%-1계산된 날짜가 0보다 크면 end로 분기한 후 %YY%, %MM%, %DD%를 반환한다. 이러한 경우는 보통 2월 2일처럼 1일 이외의 모든 경우에 해당된다. 만약 2월 1일이라면 어제는 1월 31일이므로 월에서 다시 1을 빼야한다. set /a MM=%MM%-1는 월에서 1을 빼는 과정이며 이전 과정과는 달리 1%MM%-101처럼 사용하지 않은 이유는 전단계에서 %MM%을 숫자로 변환했기때문이다.
if %MM% GTR 0 goto leap%MM%가 0보다 크면 윤년 계산으로 분기한다. 0인 경우는 1월 1일에 발생한다. 1월 1일의 어제는 전년도 12월 31일이므로 %DD%를 31, %MM%를 12, %YY%는 %YY%-1로 설정한 후 end로 분기한다.
set /a DD=31set /a MM=12set /a YY=%YY%-1goto end
:leapset /a TT=%YY%/4set /a TT=%TT%*4if not %YY% equ %TT% goto mon%MM%set /a DD=29goto end윤년을 계산하는 부분이다. 루틴이 조금 이상할 수 있지만 원리는 간단하다. %YY%/4는 현재 년도를 4로 나눈다. 즉 2006을 4로 나누면 501.5가 나오지만 .5는 잘려진다(4NT의 경우 501.5가 나오며 따라서 별도의 절단 함수를 사용해야 한다). 따라서 첫번째 %TT%에는 501이 저장된다. 이 값에 다시 4를 곱하면 2004가 나오며, 2004는 윤년에 해당된다. 마지막으로 %YY%(2006)이 윤년(2004)인지 검사해서 윤년이 아닌 경우에는 mon%MM%(mon1)로 분기하고 윤년인 경우에는 %DD%를 29로 설정한 후 end로 분기한다.
:mon1:mon3:mon5:mon7:mon8:mon10set /a DD=31goto end윤년이 아닌 경우에 큰달과 작은달, 2월을 설정하는 부분이다. 작은달의 경우 %DD%를 30일로 설정하며, 큰달의 경우 %DD%를 31일로 설정한다. 2월의 경우 윤년이 아니면 28일까지 있으므로 %DD%를 28로 설정한다.
:mon2set /a DD=28goto end
:mon4:mon6:mon9:mon11set /a DD=30goto end
:endset /a DD=%DD% + 100set DD=%DD:~1,2%set /a MM=%MM% + 100set MM=%MM:~1,2%이전 단계에서 계산을 위해 %DD%와 %MM%를 숫자로 변한했다. 이 경우 1, 2처럼 숫자앞에 선행하는 0이 없으므로 선행하는 0을 샆입하는 루틴이다. 만약 %DD%가 1이라면 %DD%에는 101이 저장된다. 아울러 두번째 set 명령의 DD=%DD:~1,2%의 의미는 %DD% 변수의 1번째 자리부터 2개의 문자열을 복사(~)하라는 뜻이다. 만약 DD=%DD:~0,2%를 사용한다면 0번째 자리부터 2개의 문자열을 복사하므로 20이 결과 값이된다.
다운로드: 배치 파일의 작성에 익숙하지 않은 사용자는 다음 링크에서 배치 파일을 다운받을 수 있다. 압축 파일에는 현재의 날짜를 출력하는 today.cmd와 어제의 날짜를 출력하는 yesterday.com가 포함되어 있다.
'IT노트 > Linux' 카테고리의 다른 글
프로세스란? (0) | 2015.02.16 |
---|---|
매일 MYSQL DB DUMP 및 30일지난 dump(.sql)파일 삭제 (0) | 2015.02.16 |
APM 관련 라이브러리 설치 (0) | 2015.02.16 |
리눅스 port를 열기 위해서는 iptables를 통해서, 포트를 열고 막고를 할 수 있습니다. (0) | 2015.02.15 |
Linux 에서 부팅시 자동실행 스크립트 및 등록방법 (0) | 2015.02.15 |