Posted at

Windowsバッチで日付計算を扱う際の注意点

More than 3 years have passed since last update.

Windowsバッチで、日付の計算を行う必要があり、自作でロジックを組んだが、本番障害を起こしてしまった。

原因は、現在日(%DATE%)をそれぞれ年、月、日に分割して足し引きを行うところで、

日が10未満の場合に「08」のようになっており、

そのまま計算していたところで

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

というエラーで落ちてた。

これが8日と9日にだけ発生していた。

確かに本来は10未満の場合は「08」⇒「8」に変換してから計算すべきだったけど、

それは1日から7日までも同様だったはず。

しかも1日などはテストでもやっていたのに・・・

そのカラクリはこうだった。

DOSコマンドで数値は、先頭が「0」の場合は8進数とみなされる。

計算する際に10進数に暗黙的に変換されて処理されるが、

「01」~「09」の場合

「01」~「07」までは8進数を10進数に変換すると「1」~「7」になるため正しく処理される。

ただし、「08」、「09」の場合はそんな8進数は存在しない。

そのためエラーになったわけだ。

覚えておこう。

そしてちゃんと10未満以下の場合の変換を明示的に行うようにしよう。

回避策としては

月、日を変換する場合は年、月、日に分割した後、

分割後の文字列の左端に「1」を付与し、100を引くことで正しく変換できる。

例:

set dd = '08'

set /a dd = 1%dd% - 100