2011年8月3日水曜日

標準アクティビティだけで BAT ファイルを置換 (6)

タイトルが長いと面倒ですねw
今回は「フォルダ内にある、3 日前以前に作成されたファイルを削除」という処理を行ってみます。この処理を BAT ファイルで行うのは大変なのですが、需要はかなりあるのではないでしょうか。BAT ファイルのみで日付演算を行う事は、不可能ではないのですが非常に面倒です。その中でも楽に済ませたい場合は VBS を利用する事が多いと思います。
もしファイル名に日付を持ち、そこで判断させるような場合は BAT ファイルとして次のような記述で対応が可能です。
   1: FOR /F "skip=3" %%i in ('dir /b /o-n ????????.log') do del %%i

ただしこの記述にて、希望するよう動作するには前提条件があります。上記の例ではカレントフォルダに当日日付以降のファイルが存在しない事です。というのも、実際に行われている処理としては、アルファベット順にソートして先頭 3 件の結果をスキップした後に削除を行う、というものだからです。運用で決まっているのであれば大丈夫ですが、そうでない場合には注意が必要なスクリプトとなっています。
これをワークフローで行うのであれば、VBS を利用したケースと同様にもっとしっかりとした判定を行う事が当然可能です。
limitDelete1
今回用意したワークフローはこのようなものとなります。大雑把に説明すると、先に削除対象となる日付を算出し、指定したフォルダのファイル一覧を取得、結果でループを行い各ファイルの作成日時を取得、指定日より古ければ削除を行う、というものになっています。
最初の Assign アクティビティでは DateTime.Now.AddDays(-3) と記述し、3日前の日付を求めています。続く ForEach アクティビティではループ対象として、System.IO.Directory.GetFiles("D:\","*.log") などのように記述し、対象フォルダのファイル一覧を取得しています。
limitDelete3
そこから先の部分を拡大すると上記のようになります。まずはファイルの作成日付を Assign アクティビティにて取得します。System.IO.File.GetCreationTime(item) と記述します。その結果と、最初に算出しておいた期限日を If アクティビティにて比較し、小さい(古い)のであればファイルの削除を行います。
今回はファイル削除部分を InvokeMethod アクティビティにて System.IO.File.Delete メソッドを呼び出し、その処理自体を TryCatch アクティビティにて例外が発生した場合はスルーするような形にしています。Catches 部分では対象となる Exception を System.Exception とし全ての例外をトラップするようにしますが、トラップ時の処理は特に何も設定しないでおきます。
このような形で、特定日より古いファイルを一括して削除が行えます。このあたりは BAT ファイルのみで処理をするよりもやりやすくなっているところです。

0 件のコメント:

コメントを投稿