久しぶりに
ちょっとバックアップファイル削除用バッチを作成したのでメモ
/::::::::::::::::::::::::::::::::::::::::::/
@echo off
rem ------------------------
rem 概要
rem ------------------------
rem 土日はバックアップしない
rem 月火水木金はバックアップする
rem 月曜は先週分までを残す
rem 3世代(3日分)残す
rem 今日、昨日、一昨日
rem 今日、昨日、一昨日を取得
rem 曜日を取得
rem 先週の月曜の日付を取得
rem 水木金の場合、後ろ2日分を残す
rem 月火の場合、土日を抜いた後ろ2日分を残す
rem 木、金、月を残す
rem ------------------------
rem ===========================
rem 初期設定
rem ===========================
rem Backup File1 PATH
SET BF1=D:\BK\File1\
rem Backup File2 PATH
SET BF2=D:\BK\File2\
rem Backup File Name
SET BAK=*.bak
@REM 日付分割
SET YY=%date:~0,4%
SET MM=%date:~5,2%
SET DD=%date:~8,2%
rem ===========================
rem 今日の日付取得
SET HOY=_%YY%_%MM%_%DD%_
rem 閏年取得
Call :URUTOSHI %YY%
rem 今日の曜日取得
@REM 日付分割
SET Y1=%date:~0,2%
SET Y2=%date:~2,2%
@REM ゼロを補正
IF "0"=="%DD:~0,1%" SET DD=%DD:~1,1%
IF "0"=="%MM:~0,1%" SET MM=%MM:~1,1%
@REM 曜日計算(ツェラーの公式より)
rem 例:2017年 C=20, Y=17と置き換える
rem 2017年1,2月は、2016年13月1日・14月1日とする
rem 公式
rem h={d+[26(m+1)/10]+Y+[Y/4]+Γ} mod 7
rem Γ=5C+[C/4]
rem 1,2月のとき年月を変更
IF 1==%MM% (
SET /A Y2=%Y2%-1
SET /A M1=13
) ELSE IF 2==%MM% (
SET /A Y2=%Y2%-1
SET /A M1=14
) ELSE (
SET /A M1=%MM%
)
SET /A P1=26*(%M1%+1)
SET /A P2=5*%Y1%+(%Y1%/4)
SET /A P3=%P1%/10
SET /A P4=%Y2%/4
SET /A P5=%DD%+%P3%+%Y2%+%P4%+%P2%
SET /A WW=%P5%%%7
rem echo "P1:"%P1%
rem echo "P2:"%P2%
rem echo "P3:"%P3%
rem echo "P4:"%P4%
rem echo "P5:"%P5%
@REM Week s m t w t f s
@REM %WW% 1 2 3 4 5 6 0
rem echo "曜日:"%WW%
@REM ゼロを補正
SET MM=0%MM%
SET MM=%MM:~-2%
rem SET DD=0%DD%
rem SET DD=%DD:~-2%
rem 昨日の日付取得
Call :1DAYAGO
rem 一昨日の日付取得
Call :2DAYAGO
if "%WW%"=="1" goto SUNDAY
if "%WW%"=="2" goto MONDAY
if "%WW%"=="3" goto TUESDAY
if "%WW%"=="4" goto WEDNESDAY
if "%WW%"=="5" goto THURSDAY
if "%WW%"=="6" goto FRIDAY
if "%WW%"=="0" goto SATURDAY
:SUNDAY
rem 金曜日と同じため、何もさせない
rem バックアップをしていない
goto END
:MONDAY
echo "月曜日"
rem 取得FRIDAY
SET /A NUM=3
Call :LASTWEEK %NUM%
rem 取得THURSDAY
SET /A NUM=4
Call :LASTWEEK %NUM%
rem 取得1週間前MONDAY
SET /A NUM=7
Call :LASTWEEK %NUM%
goto END
:TUESDAY
echo "火曜日"
rem 取得FRIDAY
SET /A NUM=4
Call :LASTWEEK %NUM%
rem 取得1週間前MONDAY
SET /A NUM=8
Call :LASTWEEK %NUM%
goto END
:WEDNESDAY
echo "水曜日"
rem 取得1週間前MONDAY
SET /A NUM=9
Call :LASTWEEK %NUM%
goto END
:THURSDAY
echo "木曜日"
rem 取得1週間前MONDAY
SET /A NUM=10
Call :LASTWEEK %NUM%
rem 取得今週MONDAY
SET /A NUM=3
Call :LASTWEEK %NUM%
goto END
:FRIDAY
echo "金曜日"
rem 取得1週間前MONDAY
SET /A NUM=11
Call :LASTWEEK %NUM%
rem 取得今週MONDAY
SET /A NUM=4
Call :LASTWEEK %NUM%
goto END
:SATURDAY
rem 金曜日と同じため、何もさせない
goto END
rem >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
:END
rem echo "今日"%HOY%
rem echo "昨日"%AYE%
rem echo "一昨日"%ANT%
rem echo "木曜"%JUE%
rem echo "金曜"%VIE%
rem echo "今月"%MON%
rem echo "先月"%LUN%
Call :FILE_DEL %BF1%
Call :FILE_DEL %BF2%
rem PAUSE
EXIT
rem :::::::::::::::::::::::::::::::::::::::::::::::::::
rem 関数
rem :::::::::::::::::::::::::::::::::::::::::::::::::::
:1DAYAGO
SET /A NUM=1
Call :LASTWEEK %NUM%
EXIT /B
:2DAYAGO
SET /A NUM=2
Call :LASTWEEK %NUM%
EXIT /B
:LASTWEEK
SET /A SP=%DD% - %1
SET SP=0%SP%
SET SP=%SP:~-2%
IF -==%SP:~0,1% (
rem 先月取得
Call :SENGETSU %1
rem ) ELSE IF 0==%SP:~0,1% (
) ELSE IF 00==%SP% (
rem 先月取得
Call :SENGETSU %1
) ELSE (
IF 1==%1 (
SET AYE=_%YY%_%MM%_%SP%_
) ELSE IF 2==%1 (
SET ANT=_%YY%_%MM%_%SP%_
) ELSE IF 3==%1 (
IF "5"=="%WW%" (
SET MON=_%YY%_%MM%_%SP%_
) ELSE (
SET VIE=_%YY%_%MM%_%SP%_
)
) ELSE IF 4==%1 (
IF "2"=="%WW%" (
SET JUE=_%YY%_%MM%_%SP%_
) ELSE IF "3"=="%WW%" (
SET VIE=_%YY%_%MM%_%SP%_
) ELSE IF "5"=="%WW%" (
SET MON=_%YY%_%MM%_%SP%_
) ELSE IF "6"=="%WW%" (
SET MON=_%YY%_%MM%_%SP%_
)
) ELSE IF %1 GEQ 7 (
IF %1 LEQ 11 (
rem %1==7-11
SET LUN=_%YY%_%MM%_%SP%_
)
)
)
EXIT /B
:SENGETSU
rem Call :SENGETSU %1(NUM)
IF 00==%SP% (SET SP=)
IF %MM%==01 (SET MA=12&& SET /A DA=31%SP%&& SET /A YA=%YY%-1)
IF %MM%==02 (SET MA=01&& SET /A DA=31%SP%&& SET YA=%YY%)
IF %MM%==03 (SET MA=02&& SET /A DA=28%SP%&& SET YA=%YY%&& IF %YMOD%==0 (SET /A DA=29%SP%))
IF %MM%==04 (SET MA=03&& SET /A DA=31%SP%&& SET YA=%YY%)
IF %MM%==05 (SET MA=04&& SET /A DA=30%SP%&& SET YA=%YY%)
IF %MM%==06 (SET MA=05&& SET /A DA=31%SP%&& SET YA=%YY%)
IF %MM%==07 (SET MA=06&& SET /A DA=30%SP%&& SET YA=%YY%)
IF %MM%==08 (SET MA=07&& SET /A DA=31%SP%&& SET YA=%YY%)
IF %MM%==09 (SET MA=08&& SET /A DA=31%SP%&& SET YA=%YY%)
IF %MM%==10 (SET MA=09&& SET /A DA=30%SP%&& SET YA=%YY%)
IF %MM%==11 (SET MA=10&& SET /A DA=31%SP%&& SET YA=%YY%)
IF %MM%==12 (SET MA=11&& SET /A DA=30%SP%&& SET YA=%YY%)
@REM Week s m t w t f s
@REM %WW% 1 2 3 4 5 6 0
IF 1==%1 (
SET AYE=_%YA%_%MA%_%DA%_
) ELSE IF 2==%1 (
SET ANT=_%YA%_%MA%_%DA%_
) ELSE IF 3==%1 (
IF "5"=="%WW%" (
SET MON=_%YA%_%MA%_%DA%_
) ELSE (
SET VIE=_%YA%_%MA%_%DA%_
)
) ELSE IF 4==%1 (
IF "2"=="%WW%" (
SET JUE=_%YA%_%MA%_%DA%_
) ELSE IF "3"=="%WW%" (
SET VIE=_%YA%_%MA%_%DA%_
) ELSE IF "5"=="%WW%" (
SET MON=_%YA%_%MA%_%DA%_
) ELSE IF "6"=="%WW%" (
SET MON=_%YA%_%MA%_%DA%_
)
) ELSE IF %1 GEQ 7 (
IF %1 LEQ 11 (
rem %1==7-11
SET LUN=_%YA%_%MA%_%DA%_
)
)
EXIT /B
:URUTOSHI
rem 閏年(閏年の場合はYMOD=0)
rem 年を4で割った余りをYMODに取得
SET /A YMOD=%1 %% 4
rem 余りがない(4の倍数である)
IF "%YMOD%"=="0" (
rem 年を100で割った余りを取得
SET /A YMOD_100=%1 %% 100
rem 100で割りきれているか
IF !YMOD_100!==0 (
rem 年を400で割った余りを取得
SET /A YMOD_400=%1 %% 400
REM 400で割り切れていない場合(2100年など)
IF NOT !YMOD_400!==0 (
REM 閏年を無に設定
SET /A YMOD=1
)
)
)
EXIT /B
:FILE_DEL
rem 対象ディレクトリを検索後、ファイルを削除
for /r %1 %%A in (%BAK%) do (
rem 今日分を除く
echo %%A | find "%HOY%" >NUL
if errorlevel 1 (
rem 昨日分を除く
echo %%A | find "%AYE%" >NUL
if errorlevel 1 (
rem 一昨日分を除く
echo %%A | find "%ANT%" >NUL
if errorlevel 1 (
rem 先週の月曜を除く
echo %%A | find "%LUN%" >NUL
if errorlevel 1 (
rem 今週の月曜を除く
echo %%A | find "%MON%" >NUL
if errorlevel 1 (
rem 金曜を除く
echo %%A | find "%VIE%" >NUL
if errorlevel 1 (
rem 木曜を除く
echo %%A | find "%JUE%" >NUL
if errorlevel 1 (
rem echo %%A
DEL /Q %%A
)
)
)
)
)
)
)
)
EXIT /B
/::::::::::::::::::::::::::::::::::::::::::/
以上
0 件のコメント:
コメントを投稿