質問者
paramの使い方とコマンド実行結果について

質問
すべての返信
-
$_.delete()、この場合はFileInfoオブジェクトのDeleteメソッドですが、これは成功した場合にTrueを返す、というような挙動はせず、成功した場合は何も値を返さず、失敗した場合はエラーが発生するという動作をします。
そのため、失敗した場合を判定するにはtry{}catch{}を使用する必要があります。
しかし、どのような動作をお望みなのかが分からないのですが、「あるファイルの削除が失敗しても、その時点で即座に終了するのではなく、すべての対象ファイルの削除を試みてから、最後に失敗があったかどうかをメッセージとして表示する」という挙動にしたいのであれば若干の工夫が必要になるかと思います。
その場合だと敢えてDelete()メソッドを使わず、Remove-Itemコマンドレットを使った方が簡便です。
#3.のelse{}の中身を以下のようにしてみてはいかがでしょうか。
Get-ChildItem ${LgFdr} | where {($_.Name -match '^Archive') -and ($_.CreationTime -lt (Get-Date).AddDays(-1))} | Remove-Item if($?) { Write-Host "finish command." exit 0 } else { Write-Host "command error" exit 3 }
$?は自動変数で、1つ前の行に含まれるコマンドがすべてエラー無く終了すればTrueが、1つでもエラーが発生すればFalseが格納されますので、これを用いて条件分岐が可能です。
それとGet-ChildItemに渡すパラメータは$LogFolderではなく${LgFdr}かと思いますので、変えてます。あとAddDays(+1)だと常にTrueになってしまいますので、「昨日より前に作成されたファイル」を対象とするように、AddDays(-1)に変えています。
- 回答の候補に設定 チャブーンMVP 2018年5月26日 9:09
-
ご指摘ありがとうございます。
自動変数とRemove-Item、勉強になります。
例えば、上記スクリプトのps1ファイルに、削除開始期間の日数を引数で付けて実行させたい場合「./ps1 日数(+~、-~等)」、
AddDays(+1)の部分をAddDays($days)とし、
elseif(!(Test-Path ${LgFdr}) -or ([string]::IsNullOrEmpty(${LgFdr})))の中に追記で日数の引数をチェックさせたい場合、
記述およびparam([string]$days)などのparamはどのように書くべきでしょうか。
また、Invoke-Expression ${commandline}にGet-ChildItem~からの構文を渡すことは可能でしょうか。