8.22.2017

[Windows] Batch 曜日取得方法

久しぶりに

ちょっとバックアップファイル削除用バッチを作成したのでメモ


/::::::::::::::::::::::::::::::::::::::::::/
@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

/::::::::::::::::::::::::::::::::::::::::::/
以上