おもしろ最新情報(こはるのページ)

おもしろ新最新情報をお届けします

No772 バッチ処理で昨日の日付を求める方法です。

2011年06月23日 | おもしろ新最新情報
最新情報をお届けします。

MS-DOSのバッチ処理で、昨日の日付を求めたいときは
次のようにします。

@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
:: echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=1%dd%-101
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=1%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=1%yy%-101)
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 昨日は、%yy%年%mm%月%dd%日です。


ここで注目なのは、1日前の日付を計算する式

set /a dd=1%dd%-101

です。

set /a dd=%dd%-1

でいいじゃないかと思いでしょうが、
今日が8日か9日の時に次のようなエラーが出ます。

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

そう、8日だと dd が08となりますが、
数字の頭に0が付いていると8進数とみなされるので、
8と9が入っていれば無効な8進数となるのです。

そこで、 08-1 ではなく、108-101 と、10進数の計算をさせるのがみそです。