Windows Server 2012 R2 で PowerShell 製のバッチを使う

今回の目標

Windows のジョブに登録したバッチ処理で「特定のディレクトリから最終更新日時が一週間以上前のファイルを削除する」という目的を達成します。
なお、この処理はやむにやまれぬ事情で作成に至ったものであり、私は PowerShell の文法を順序立てて学習していないため冗長な箇所などあるかもしれません。

ps1 ファイルの作成

処理の本体になる PowerShell のファイルを作成します。
中身は以下のコードのような感じですが、バックスラッシュは通常の円記号とは別の文字として認識されるため注意してください。

$path = "C:\path\to\batch"
$tgt = (Get-Date).AddDays(-7)

Get-ChildItem -Path $path | Where-Object {$_,LastWriteTime -lt $tgt} | Remove-Item

bat ファイルの作成

上で作成した PowerShell は対話式コンソールから実行可能ですが、バッチとして動かす場合適切な実行権限を与えないとエラーになります。仕方が無いので .bat ファイルから権限の変更→ ps1 ファイルの実行→権限を戻す、という流れで動作させるようにします。

以下のサイトを参考に、というよりほぼコピペで作成しました。
http://no6.hatenablog.com/entry/2014/01/31/161608

一点、元のサイトでは %CD% でカレントディレクトリを指定していますが、バッチの実行時には exe ファイルの存在する位置がカレントディレクトリになります。そのためフルパスで記述した方が安全でしょう。

タスクの作成

普通にタスクスケジューラから登録を行うだけなのですが、「最上位の特権で実行する」にチェックを入れる事と、履歴を残す設定にしないとうまく実行されたかどうかも分からない点に注意してください。

追記、ネットワークドライブの取扱

ネットワークドライブはバッチから参照する場合改めてマウントし直す必要があります。具体的には以下のようになります。

net use Q: \\127.0.0.1\share password /user:user

$path = "C:\path\to\batch"
$tgt = (Get-Date).AddDays(-7)

Get-ChildItem -Path $path | Where-Object {$_,LastWriteTime -lt $tgt} | Remove-Item

net use Q: /delete

ところによりバックスラッシュだったりスラッシュだったりするので注意してください。