2008年7月26日土曜日

WindowsServer、Forfilesコマンドで古いログを自動で削除

ログをとるのは運用管理の基本ですが、とったログをいつまでも残しておくといつしか記憶域を圧迫します。
WindowsServerで一定期間保存したログを自動で消そうと思ったらVBSでちょっとしたスクリプトを書く必要が?
 
いや、単純な処理ならWindowsServer2003から標準※で使用できるForfilesコマンド(マイクロソフトTechNetへリンク)で十分可能です。
Linuxでいうfindコマンドと似たような処理ができるからです。
 
※XP以前でもリソースキットに入っているようです。
 
こんな感じで使います。
 
"E:\logs"フォルダ内の拡張子が".log"のファイルで更新日が10日以上前のものを削除、フォルダは無視
> forfiles /P "E:\logs" /M *.log /C "cmd /c if @isdir==FALSE del /s @path" /D -10

 
見たい人は説明をどうぞ
 

解説


TechNetに全部書いてあるといえばそうなので、そちらを参照しながらという前提で説明します。

  • /P "E:\logs"
    作業対象フォルダのパスを指定。

  • /M *.log
    ファイルマスク。ワイルドカードと拡張子、定石ですね。

  • /C "cmd /c if @isdir==FALSE del /s @path"
    ここがややこしいでしょうか、/Cオプションはコマンドに渡すとなっていますが、「渡す=シェルで即実行」ではないので
    コマンドプロンプトで使える組み込みコマンドを使うには、cmd.exeを立ち上げる必要があります。
    で、Forfilesで条件にあったファイルはオブジェクトに対してプロパティを指定するような形で、
    ファイル名その他情報を取り出すことができます。
    @isdirでフォルダか判断して、ファイルなら@path=フルパスで delコマンド に渡します。

  • /D -10
    最終更新日が10日前以前のファイルを処理対象にする。
    日付指定して、指定日付より前または後をまとめて処理対象という使い方もできます。


 
実際に使う際は、まず del でなく echo をつかって十分に確かめてから。
条件を工夫したり、サブディレクトリを再帰するようにしたりと使い勝手は様々です、圧縮コマンドに渡すのもよいですね。