古いログファイルを削除する

古いログファイルを削除する必要があって、最初フリーソフトを探していたんだけど、スケジュールで自動実行させたいので画面が出るやつは×、.NET Framework 1.1も入っていないWindows2000環境で動かすので、VBランタイムが必要とかVisualStudioでコンパイルしたやつなんかは軒並み×で、唯一見つかったのが、これ(→NDELの詳細情報 : Vector ソフトを探す!)。
ボクの環境だとなんの問題もなく動いていたので、これでいいじゃんということで現地環境で動かしてもらったら、ちゃんと動かないですと。たぶん、短い形式の日付の設定がおかしいからじゃないかなと思ったんだけど、これをいじるといま動いてる他のプログラムが動かなくなると嫌なので、仕方ないからバッチファイルで作りましょということで、そのメモ。

使い方

> LogDel [BLD*.log] [7] [2008/04/08]

カレントディレクトリの該当ファイルを削除します。特定の用途のために作ったので、引数が微妙に一般的じゃないところはご愛嬌。バッチファイルなのですぐ直せるでしょ。[???YYYYMMDD.log]みたいな指定にして、YYYYMMDDの位置でファイル名から年月日を切り出すようにすればいいんじゃないかな。
引数1は削除対象のファイル・パターン、引数2は過去日数、引数3は基準日。指定しないと、この例の値(基準日は今日)が使用されます。

LogDel.bat

@echo off
if "%1"=="" (set a=BLD*.log) else (set a=%1)
if "%2"=="" (set b=7)        else (set b=%2)
call d2jd %3 >nul
set /a jd=jd-%b%
:LOOP
if %jd% GTR 0 goto recover
   set jdans=%jd%
   set /a yy=yy-1
   call d2jd %yy%/12/31 > nul
   set /a jd= jdans + jd
   goto LOOP
:recover
   call jd2d %jd% %yy% > nul
set yf=%dt:~0,4%
set yy=%dt:~2,2%
set mm=%dt:~5,2%
set dd=%dt:~8,2%
set ymd=%yf%%mm%%dd%
for %%f in (%a%) do call :compsub %%f %ymd%
goto :end
:compsub
set ff=%1
set fn=%ff:~3,8%
if %fn% LSS %2 echo del %1&& del %1
goto :EOF
:end

長くなるので、d2jd.bat、d2jd.batは次の日へ続く。詰まったところは、for のなかでファイル名を%%fでとって、それをset で分解したかったのですが、for %%f in (%a%) (set ff=%%f& set fn=%ff:~3,8%) がなぜかうまくいかなかったところ。%ffがみんな同じ値になってしまうんです。原因はよくわからないけど、サブルーチンにしたらうまくいったのでそれでOKとしてしまいました。

参考

参考というか、こちら(→http://homepage1.nifty.com/jak/batch/jdate.html)がオリジナルです。大変勉強になりました。バッチファイルのソースまで載せないでリンクを貼っておくだけで十分なんですが、自分用メモということでお許しを。