• ベストアンサー

PowerShell try~catchについて

現在、Powershellでスクリプトを作成中ですが、動作がうまくいかず困っております。 スクリプトには以下のコードを記述しています。 簡単に書くと、対象のディレクトリにある作成から90日を超えたアイテムを削除、削除できたら"成功"、削除できなかったら"失敗"と表示します。 $log_dir #削除するファイルが入っているディレクトリ $message1 = "削除完了" $message2 = "削除失敗" try { #作成から90日経過したファイルを削除  Get-Childitem $log_dir | Where-Object [$_.LastWriteTime -lt (Get-Date).AddDays(-90)} | Remove-Item #削除完了メッセージ表示  Write-Host $message1 } catch { #削除失敗メッセージ表示 Write-Host $message2 } 現時点で$log_dirに90日を超えてないファイルがあったとします。 その際は削除されないのですが、上記のコードのままだと$message1が表示されてしまい、catchにいきません。 どう修正すれば、catchに行くでしょうか? Powershell初心者のため、申し訳ございませんが、ご教示をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

90日を超えていないファイルがひとつでもあった場合、と言うことでしたら、 例えば、以下のように、前もってそのファイルがあるかどうか確認して、あれば終了するとかになると思います。 if((Get-Childitem $log_dir | Where-Object {$_.LastWriteTime -ge (Get-Date).AddDays(-90)}).Count -ne 0){ Write-Host "90日を超えていないファイルがあります" exit } 余談 LastWriteTime は最終更新日時ですが大丈夫でしょうか。 作成日時は CreationTime です。 それと、90日と言っても、このままでは時刻も含まれているので、90日前の現在時刻との判定になっていると思います。

ptgapsokwave
質問者

お礼

ありがとうございました。

その他の回答 (1)

  • luka3
  • ベストアンサー率72% (424/583)
回答No.1

try~catch は処理を行おうとした時に、例外が発生した場合に対応するものです。 ですので、【ファイルを削除できた】場合には【処理が正常に動作した】ため例外は発生しません。 ここで例外が発生するには、ファイルがロックされているなどの理由で削除しようとしたが失敗した、などになります。 $message2の表示を確認したい場合は、例えば、90日前のOfficeファイルを開いた状態(ロックがかかる)でスクリプトを実行してみてください。 90日を超えてないファイルは、Where-Objectで【条件の対象外】となったことから次の処理(Remove-Item)へ渡されないだけで、これも正常な処理なので例外発生とはなりません。 $message2は"削除失敗"なんですよね? "90日以内のファイルです" ではないですね。 スクリプトは間違ってないです。

ptgapsokwave
質問者

お礼

ありがとうございました。