batで昨日の日付取得したらミスった話

WindowsServerで現在から1日前の日付をyymmdd形式で取り出すバッチ
http://tmgbl.blog.fc2.com/blog-entry-30.html

↑の記事を参考に昨日の日付を取得してファイルのコピーをなんやかんや…
ってbatファイル作ってたんですが、今日になって何故かエラーを吐く。

「無効な数字です。数値定数は 10 進 (17 桁)、16 進 (0x11 桁)、または 8 進 (021 桁) です。」

え、昨日は普通に動いてたやん…

そのときのコード

::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%

echo Today is %yy%%mm%%dd%

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)
echo Yesterday is %yy%%mm%%dd%

 

ってことで、検索したらこういうことみたい。

 

Windowsバッチで日付計算を扱う際の注意点
https://qiita.com/giiwa/items/c4b0ace52b191d58da83

 

8進で判定されるのか…

 

ってことで一行足します。

 

::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%

echo Today is %yy%%mm%%dd%

::1日前の日付を計算する
set /a dd=1%dd%-100
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)
echo Yesterday is %yy%%mm%%dd%

 

これでしっかり計算できてました。

バックアップのスクリプトなので、気付いてなかったらちょっとヤバかった。

気をつけねば…