2016-10-28 11 views
0

現在PowerShellが新しく、フォルダ内に見つかったLastWriteTimeが1未満のファイルの削除操作を実行するネット上の情報を収集したスクリプトを作成しました日。私は-WhatIfコマンドを知っている限りでWindows PowerShell - X日以上経過したファイルを削除する

$timeLimit = (Get-Date).AddDays(-1) 
$oldBackups = Get-ChildItem -Path $dest -Recurse -Force -Filter "backup_cap_*" | 
       Where-Object {$_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit} 

foreach($backup in $oldBackups) 
{ 
    Remove-Item $dest\$backup -Recurse -Force -WhatIf 
} 

するコマンドは、現実のシナリオで行う「すべき」ものをコンソールに出力:

現在のスクリプトは次のようです。問題は-WhatIfが何も出力せず、ファイルを削除してもファイルが期待通りに削除されないということです。

サーバーはWindows 2012 R2であり、コマンドはPowerShell ISE V3内で実行されています。

コマンドが機能すると、別のタスクのバックアップが完了した後、毎晩実行されるタスクに「変換」されます。

+0

2が必要であることに注意してください)あなたがファイルを削除したい場合は、なぜあなたは唯一の '$ PSIsContainer'とフォルダを含めていますか? 3)それがあなたのスクリプトなら、$ destはどこから来ますか?定義されていない場合、gciはエラーなしで現在の作業ディレクトリを読み込みます。 4) '$ oldBackups'に何かがあることを確認しましたか? 5) 'Remove-Item'は存在しないファイルに関する例外をスローしますか? – TessellatingHeckler

+0

$ destは外側のスコープ内で上で宣言されています。これはスクリプトの作業ディレクトリです。そこにバックアップが作成されます。そして、いいえ、例外は投げられません。 $ PSIsContainerに関して、あなたは正しいです。私たちは、バックアップがフォルダーにないと判断しました。それらは直接作業ディレクトリにあるので、基本的にバックアップはmysqldumpによって出力されるbackup_cap_dateOfWriteパターンの下にあります。 – darksleep

答えて

2

私はこれが私のために働いたパイプ

Get-ChildItem C:\temp | ? { $_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit } | Remove-Item -WhatIf 

でそれをやりました。そのため、ファイルへの正しいパスを気にする必要はありません。

1

他のソリューション

$timeLimit = (Get-Date).AddDays(-1) 
Get-ChildItem C:\temp2 -Directory | where LastWriteTime -lt $timeLimit | Remove-Item -Force -Recurse 
0

オリジナルの問題は、各ファイルがルートフォルダにあったことを前提としています$dest\$backupました。しかし、プロパティを$backupに使用すると、ディレクトリを静的に定義する必要はありません。

もう一つの注目すべきは、その削除-項目は文字列の配列を取るので、あなたはまた、パイプラインを使用せずに、ここにあなたのスクリプトへの修正ですforeach

を取り除くことができます。私はwhereメソッドを使用するので、これは、少なくともバージョン4

$timeLimit = (Get-Date).AddDays(-1) 
$Backups = Get-ChildItem -Path $dest -Directory -Recurse -Force -Filter "backup_cap_*" 
$oldBackups = $backups.where{$_.LastWriteTime -lt $timeLimit} 
Remove-Item $oldBackups.fullname -Recurse -Force -WhatIf 
関連する問題