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

    質問

  • $commandline = Get-ChildItem $LogFolder | ?{($_.Name -match '^Archive') -and ($_.creationtime -lt (get-date).AddDays(+1))} | ForEach{$_.delete()}
           

    • 編集済み teracoma 2018年6月6日 22:07
    2018年5月20日 15:49

すべての返信

  • $_.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)に変えています。

    2018年5月20日 20:00
    モデレータ
  • ご指摘ありがとうございます。
    自動変数と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~からの構文を渡すことは可能でしょうか。


    2018年5月21日 20:52
  • .ps1ファイルの1行目に

    param([int]$days)

    と記述するだけで良いように思います。

    日数の範囲チェック等は、普通にif($days -lt 5){Write-Host "範囲外です"; exit 5}のようにすれば良いかと思います。

    Invoke-Expressionの件については別スレッドを立てられているようなので省略します。

    2018年5月22日 2:54
    モデレータ