기 타 배치파일에서 날짜 찾아서 백업을 하려는데..
2022.08.03 12:44
로보카피에서 7일안에 해당되는 자료를 백업하려고 하는데
이상하게 아래와 같이 하면 rarDate가
9일 이상일때는 백업이 잘 되었는데
9일 이하일때는 잘안되네요
오늘 다시 보니
1224
가 나오는데 뭐가 잘못된거죠..
@echo off
title 타이틀
::echo %date%
set yyyy=%date:~0,4%
::echo %yyyy%
set mm=%date:~5,2%
::echo %mm%
set dd=%date:~8,2%
::echo %dd%
if %dd%==08 (
set dd=8 ) else (
if %dd%==09 (
set dd=9 ) )
if %mm%==08 (
set mm=8 ) else (
if %mm%==09 (
set mm=9 ) )
set /A dd=%dd% - 7
set /A mm=%mm% + 0
if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
if %mm%==12 goto SET31
goto ERROR
:SET31
set /A dd=31 + %dd%
goto DONE
:SET30
set /A dd=30 + %dd%
goto DONE
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto DONE
:SET29
set /A dd=29 + %dd%
:DONE
if /i %dd% LSS 10 set dd=0%dd%
if /I %mm% LSS 10 set mm=0%mm%
set rarDate=%yy%%mm%%dd%
echo %rarDate%
댓글 [8]
-
내꼬 2022.08.03 13:43 -
열심히하자 2022.08.03 13:54
감사드립니다.
되었다 안되었다 해서 헷갈렸네요..
-
지후빠 2022.08.03 15:32
cmd에서 파워쉘 이용하여 일주일 전 일자를 구하면 다음과 같습니다.
for /f %A in ('powershell ^(Get-Date^).AddDays^(-7^).ToString^(^'yyyyMMdd^'^)') do echo %A
for /f %A in ( 'powershell -c "(Get-Date).AddDays(-7).ToString(\"yyyyMMdd\")"') do echo %A
-
열심히하자 2022.08.03 18:32
감사드립니다.
내일 다시 확인해 보겠습니다.^^
그런데 로보카피말고 보면 그냥 20211224이 나옵니다.
이 오류는 어떻게 잡을수 있을까요..
-
지후빠 2022.08.03 23:30
if 문에서 /i 옵션은 문자를 비교할 때 사용합니다. 숫자 비교이므로 빼셔야 할 것 같습니다.
-
메리아 2022.08.03 16:11
본문명령보니 배치파일로 윤년까지 엄청 복잡하게 계산한거 같군요.
그리고 08 09 이런게 8진수인가 16진수인가 변형되는거도 있나보네요.
여러 언어중에 일부 숫자파싱에서는 희한하게 07까지는 괜찮은데
딱 08 09가 8진수로 인식되는게 있을겁니다. 이거 거르기 참 난감합니다. 배치파일에도 있나보군요.
그래서 가능한한 배치파일에서 날짜 계산하면 안좋죠... ㅠㅠ
먼저
대충의 기한을 원한다면
robocopy "소스경로" "백업경로" /s /maxage:9
이런식으로 일자단위 숫자만 넣어주면 됩니다.
특정일자 이후를 원한다면
robocopy "소스경로" "백업경로" /s /maxage:20220801
이런식으로 넣어주면 되는데요(2022-08-01이 포함됨)
상기의 사항에서 /maxage:1을 넣을경우 24시간인지 어제날짜이후(포함)인지 좀 가물가물한데요
아무튼 일단위 백업에서는 조금 거슬릴 수 있습니다.
포기하던가, 날짜기준으로 구분할수있는 일단위라면 오늘날짜를 넣으면 되겠죠.
(어제날짜도 필요하면 아예 걍 /maxage:1 로 해야합니다. 로보카피에서는 /maxage:0이라거나 시간,분단위 등으로 더 세세하게는 안됨.)
오늘날짜 기준으로 할경우
set "start_yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%"
robocopy "소스경로" "백업경로" /s /maxage:%start_yyyymmdd%
이러면 됩니다.
그리고 rarDate인거보면 압축파일 rar에도 써먹으려는 거겠죠?
아마 -ta옵션에 yyyymmdd를 넣고자하는거 같은데, 이거보다는
-tn옵션으로 하는게 좋습니다.
https://documentation.help/WinRAR/HELPSwTN.htm
이전 9일을 원하면 -tn9d
이전 7일 12시간을 원하면 -tn7d12h
이런식으로요.
날짜가 중요하다면 좀 복잡해지겠습니다만,
윗님이 알려주신걸로 하는게 편할듯하군요.
-
열심히하자 2022.08.03 18:33
감사드립니다.
내일 다시 확인해 보겠습니다.^^
그런데 로보카피말고 보면 그냥 20211224이 나옵니다.
이 오류는 어떻게 잡을수 있을까요..
-
지후빠 2022.08.03 23:21
본문은 참고하여 제 스타일로 수정해봤습니다. ^^ date-7_test.cmd
- 윤달 참고; https://blog.naver.com/hanlaonline/222004576341
@echo off & title 타이틀 & setlocal enabledelayedexpansion
set "yyyy=%date:~0,4%"
if %date:~5,1%==0 (set mm=%date:~6,1%) else (set mm=%date:~5,2%)
if %date:~8,1%==0 (set dd=%date:~9,1%) else (set dd=%date:~8,2%)
set /a dd-=7
if %dd% gtr 0 (goto DONE) else set /a mm-=1
if %mm% equ 0 (set /a mm=12 & set /a yyyy-=1)
if %mm% equ 2 (set /a dd+=28
set /a _y=yyyy%%4 & if !_y!==0 set /a dd+=1
set /a _y=yyyy%%100 & if !_y!==0 set /a dd-=1
set /a _y=yyyy%%400 & if !_y!==0 set /a dd+=1
) else (set "m31= 1 3 5 7 8 10 12 "
if not "!m31: %mm% =!"=="!m31!" (set /a dd+=31) else (set /a dd+=30)
)
:DONE
set "mm=0%mm%" & set "dd=0%dd%" & set rarDate=%yyyy%!mm:~-2!!dd:~-2!
echo %rarDate%
endlocal & pause & exit/b
robocopy 에는 maxage: 옵션이 있습니다
maxage:9 라고 하면 지난 9일동안 생성된 파일만 복사 하게 됩니다.
확장자 및 날짜를 기반으로 파일을 일괄 복사 또는 이동하는 방법. - HowThere
참고해 보세요.