PowerShellで古いフォルダを削除

最近(と言ってもここ2日ほど)PowerShellに夢中です。
元々はSharePointのバックアップを定期的にとったり、古くなったバックアップフォルダを定期的に削除するバッチを作ろうとしていて、MSBuildやBATファイルなどを調べていたのですが、いまいちシックリくるツールが無くて困ってました。
例えば1週間以前に作成したバックアップフォルダは削除してしまうといった時、MSBuildだと結局.NETでコンソールアプリを作って、そっちで削除というMSBuild使う意味ないじゃんというオチになってました。VBScriptでも同じことで、フォルダのコレクションとってきてループで回しながら古いフォルダだけを削除というロジックを書かなきゃいけません。それはそれで良いのですが、わざわざそんなコード書きたくもないし・・・

そこで出会ったのが Windows PowerShellですよ。PowerShellで書くと次のようになります。

$BackupTimespan 	= 7
$RemoveBackupID	= [DateTime]::Now.AddDays(-1 * $BackupTimespan)
$BackupFolderPath	= "D:\MOSS\Backup"

dir $BackupFolderPath | where {($_.Mode -eq "d----") -and ($_.LastWriteTime -lt $RemoveBackupID)} | foreach { $_.Delete($TRUE) }

先頭の文字が$となっているのは変数になります。PowerShellでは.NETのオブジェクトにアクセスできるので、[DateTime]::Nowという記述で現在日付を取得できます。しかもこれ、日付型のオブジェクトとして取得できるので、AddDays()メソッドなどを呼び出して日付の計算なども簡単です。

また、フォルダの削除ですがdirコマンド(ちなみにlsコマンドも使える)でファイル一覧を取得し、whereコマンドを使ってフィルタをかけてます。ここでは、ファイルのモードがディレクトリ("d----")で、かつ最終書き込み時刻が指定された時刻以前のもの(less than で -ltなのか?)でフィルタしてます。
さらに、ここで取得したフォルダ一覧は、.NETのDirectoryInfoオブジェクトなのでDeleteメソッドを使って削除してあげることができます。しかもforeach{}を使って繰り返し!!

★訂正 2007/3/30★

dir $BackupFolderPath | where {($_.Mode -eq "d----") -and ($_.LastWriteTime -lt $RemoveBackupID)} | rm -recurse -force

後で気づいたんですが、foreach{}使うまでも無いですね。パイプで渡して、そのまま「rm -recurse -force」で削除すれば一発です。こっちの方がスマートな書き方ですね。訂正します。
★訂正 2007/3/30★


いやー超簡単だし便利。すごいなPowerShellVistaに標準搭載で無いのが至極残念ですが、インストールする価値はありますよ。興味のある方は是非お試しください。

Windows XPPowerShell 1.0
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=30125a46-b97c-4704-aa10-605e809d5933

Windows VistaPowerShell 1.0
http://blogs.msdn.com/powershell/archive/2007/01/29/windows-powershell-1-0-for-windows-vista.aspx