Windowsbatで日付の加減算

自身の備忘を兼ねて記載を行っています。
「とりあえず動いた」程度のソースなどもございますので参考程度にブラシアップ頂けると幸いです。
また、誤りやもっとよいコーディングやきれいな書き方があるなどご指摘頂けるととてもうれしいです。

## 今回のお題
batファイルで日付の加減算を行う

## では、まずサブルーチンです。
```bat
REM ADDDATE %1 %2 %3
REM %1：対象日付
REM %2：加減算を行う種類
REM      - yyyy：年の加減
REM      - m   ：月の加減
REM      - d   ：日の加減
REM     詳しくは「https://www.kanaya440.com/contents/script/vbs/function/date/date_add.html」
REM %3：加減値
REM      - 加算の場合は、プラス値
REM      - 減算の場合は、マイナス値
:ADDDATE (
	set result=
	echo WScript.Echo DateAdd("%2",%3,"%1") > tmp.vbs
	for /f "tokens=1-3 delims=/-" %%A in ('cscript //nologo tmp.vbs') do set result=%%A/%%B/%%C
	del tmp.vbs
exit /b
)

REM ENDMONTH %1 %2
REM %1：対象年(YYYY)
REM %2：対象月(MM)
:ENDMONTH (
	set result=
	set tmpYear=%1
	set tmpMonth=%2
	
	REM 翌月の算出
	set /a tmpMonth=tmpMonth+1
	
	REM 対象日の一日前を取得
	call :ADDDATE %tmpYear%/%tmpMonth%/01 d -1
exit /b
)
```

純粋なWindows batのみの処理ではないのですが、vbsを一時的に生成しその中で加減算を行うのがもっとも簡単でした(PowerShellの手もあるのですが、当方の環境では遅かったので。。。)

## 全体のソースです。
無駄なサブルーチンが増えてますが、お気になさらず・・・

```bat:sample.bat
@echo off

REM うるう年の3/1
set date1=2020/03/01
REM うるう年ではない3/1
set date2=2019/03/01
REM うるう年の2/28
set date3=2020/02/28
REM うるう年ではない2/28
set date4=2019/02/28

echo ### 日 加算 ###
::昨日
call :ADDDATE %date% d -1
echo 昨日　：%result%

::今日
call :YEAR %date%
call :MONTH %date%
call :DAY %date%
set result=%year%/%month%/%day%
echo 今日　：%result%

::明日
call :ADDDATE %date% d 1
echo 明日　：%result%

echo.

::3/1の前日(うるう年)
call :ADDDATE %date1% d -1
echo 3/1の前日 (＝＝うるう年)：%result%

::3/1の前日(うるう年ではない)
call :ADDDATE %date2% d -1
echo 3/1の前日 (！＝うるう年)：%result%

::2/28の翌日(うるう年)
call :ADDDATE %date3% d 1
echo 2/28の翌日(＝＝うるう年)：%result%

::2/28の翌日(うるう年ではない)
call :ADDDATE %date4% d 1
echo 2/28の翌日(！＝うるう年)：%result%

echo.

echo ### 月 加算 ###
::先月
call :ADDDATE %date% m -1
call :YEAR %result%
call :MONTH %result%
set result=%year%/%month%
echo 先月　：%result%

::今月
call :YEAR %date%
call :MONTH %date%
set result=%year%/%month%
echo 今月　：%result%

::来月
call :ADDDATE %date% m 1
call :YEAR %result%
call :MONTH %result%
set result=%year%/%month%
echo 来月　：%result%

echo.

echo ### 年 加算 ###
::去年
call :ADDDATE %date% yyyy -1
call :YEAR %result%
set result=%year%
echo 去年　：%result%

::今年
call :YEAR %date%
set result=%year%
echo 今年　：%result%

::来年
call :ADDDATE %date% yyyy 1
call :YEAR %result%
set result=%year%
echo 来年　：%result%

echo.

echo ### 末日取得 ###
::先月末
call :ADDDATE %date1% m -1
call :YEAR %result%
call :MONTH %result%
call :ENDMONTH %year% %month%
echo 先月末：%result%

::今月末
call :YEAR %date%
call :MONTH %date1%
call :ENDMONTH %year% %month%
echo 今月末：%result%

::来月末
call :ADDDATE %date1% m 1
call :YEAR %result%
call :MONTH %result%
call :ENDMONTH %year% %month%
echo 来月末：%result%

echo.

::先月末(うるう年)
call :ADDDATE %date1% m -1
call :YEAR %result%
call :MONTH %result%
call :ENDMONTH %year% %month%
echo 先月末(＝＝うるう年)：%result%

::先月末(うるう年ではない)
call :ADDDATE %date2% m -1
call :YEAR %result%
call :MONTH %result%
call :ENDMONTH %year% %month%
echo 先月末(！＝うるう年)：%result%

echo.
pause

REM ------------------------------------------------------------------
REM サブルーチン
REM ------------------------------------------------------------------

REM YEAR %1
REM %1：対象日付
:YEAR (
	set dateTmp=%1
	set year=%dateTmp:~0,4%
exit /b
)

REM MONTH %1
REM %1：対象日付
:MONTH (
	set dateTmp=%1
	set month=%dateTmp:~5,2%
exit /b
)

REM DAY %1
REM %1：対象日付
:DAY (
	set dateTmp=%1
	set day=%dateTmp:~8,2%
exit /b
)

REM ADDDATE %1 %2 %3
REM %1：対象日付
REM %2：加減算を行う種類
REM      - yyyy：年の加減
REM      - m   ：月の加減
REM      - d   ：日の加減
REM     詳しくは「https://www.kanaya440.com/contents/script/vbs/function/date/date_add.html」
REM %3：加減値
REM      - 加算の場合は、プラス値
REM      - 減算の場合は、マイナス値
:ADDDATE (
	set result=
	echo WScript.Echo DateAdd("%2",%3,"%1") > tmp.vbs
	for /f "tokens=1-3 delims=/-" %%A in ('cscript //nologo tmp.vbs') do set result=%%A/%%B/%%C
	del tmp.vbs
exit /b
)

REM ENDMONTH %1 %2
REM %1：対象年(YYYY)
REM %2：対象月(MM)
:ENDMONTH (
	set result=
	set tmpYear=%1
	set tmpMonth=%2
	
	REM 翌月の算出
	set /a tmpMonth=tmpMonth+1
	
	REM 対象日の一日前を取得
	call :ADDDATE %tmpYear%/%tmpMonth%/01 d -1
exit /b
)
```

```sh:実行結果
### 日 加算 ###
昨日　：2020/03/18
今日　：2020/03/19
明日　：2020/03/20

3/1の前日 (＝＝うるう年)：2020/02/29
3/1の前日 (！＝うるう年)：2019/02/28
2/28の翌日(＝＝うるう年)：2020/02/29
2/28の翌日(！＝うるう年)：2019/03/01

### 月 加算 ###
先月　：2020/02
今月　：2020/03
来月　：2020/04

### 年 加算 ###
去年　：2019
今年　：2020
来年　：2021

### 末日取得 ###
先月末：2020/02/29
今月末：2020/03/31
来月末：2020/04/30

先月末(＝＝うるう年)：2020/02/29
先月末(！＝うるう年)：2019/02/28
```

## 最後に
各サブルーチンを()で囲っていますが、私の好みですので省いて頂いて結構です