2013-07-24 22 views
130

15日以上前に特定のフォルダ内に作成されたファイルのみを削除したいと思います。 PowerShellを使ってこれをどうすればできますか?PowerShellを使用して15日以上経過したファイルを削除する

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force 
+2

は答えのほとんどはCREATIONTIMEを使用しかし、それはあなたがないかもしれないので、ファイルがコピーされた場合にリセットされますあなたが望む結果を得る。 LastWriteTimeは、Windowsエクスプローラの[日付変更]に相当します。 –

答えて

6

はこれを試してみてください。 -WhatIfスイッチは、実際にファイルを削除し、実際に(ファイルが削除されます)のファイルを削除せずに何が起こるか、にスイッチを削除することを教えてくれます:

$old = 15 
$now = Get-Date 

Get-ChildItem $path -Recurse | 
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } | 
Remove-Item -WhatIf 
+0

私は最後の '-recurse'はあまりにも多く、いいえと信じていますか? dirのリストは再帰的ですが、アイテムの削除には子が含まれていてはいけません、そうですか? – Joost

+0

うまくいっています – RayofCommand

+0

あなたが作業しているディレクトリが2つのディレクトリの深さにある場合は、2番目の時間が必要です。 –

12

基本的に、あなたは、与えられたパスのファイルを反復処理、現在の時刻から見つかった各ファイルのCreationTimeを減算し、結果のDaysプロパティと比較:

15

もう一つの方法は、現在の日付から15日間減算することであり、のみ(確かに、この記事のタイトルにあるものである)ファイルを削除するが、ここでは最初の15日間よりも古いファイルをすべて削除しますいくつかのコードだだろう与えられた答え

$root = 'C:\root\folder' 
$limit = (Get-Date).AddDays(-15) 

Get-ChildItem $root -Recurse | ? { 
    -not $_.PSIsContainer -and $_.CreationTime -lt $limit 
} | Remove-Item 
215

:その値に対してCreationTimeを比較後で残っているかもしれない空のディレクトリを再帰的に削除します。私のコードでは、-Forceオプションを使用して、隠しファイルと読み取り専用ファイルも削除します。また、OPはPowerShellの新機能であり、gci?%などが分からないことがあるので、エイリアスを使用しないことにしました。

$limit = (Get-Date).AddDays(-15) 
$path = "C:\Some\Path" 

# Delete files older than the $limit. 
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force 

# Delete any empty directories left behind after deleting the old files. 
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse 

そして、あなたは、ファイル/フォルダが実際にそれらを削除する前に削除されるかを確認したい場合はもちろん、あなただけの両方の行の末尾にRemove-Itemコマンドレットの呼び出しに-WhatIfスイッチを追加することができます。

ここに示すコードはPowerShell v2.0互換ですが、このコードとPowerShell v3.0の高速コードもhandy reusable functions on my blogと表示しています。

+11

エイリアスを使用していただきありがとうございます。 PowerShellの初心者で、Google検索でこの投稿を見つけたユーザーにとって、私はあなたの答えを最高と考えています。 –

+0

私は@ deadlydogの提案を試しましたが、-15か-35を指定していても、ファイルの作成日を数か月(または最近)に変更すると、ディレクトリの内容全体が削除されます。 – Michele

+1

はうまくいきました、ありがとう! –

1
$limit = (Get-Date).AddDays(-15) 
$path = "C:\Some\Path" 

# Delete files older than the $limit. 
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse 

これは古いフォルダとその内容を削除します。

-1
#----- Define parameters -----# 
#----- Get current date ----# 
$Now = Get-Date 
$Days = "15" #----- define amount of days ----# 
$Targetfolder = "C:\Logs" #----- define folder where files are located ----# 
$Extension = "*.log" #----- define extension ----# 
$Lastwrite = $Now.AddDays(-$Days) 

#----- Get files based on lastwrite filter and specified folder ---# 
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $Null) 
    { 
     write-host "Deleting File $File" backgroundcolor "DarkRed" 
     Remove-item $File.Fullname | out-null 
    } 
    else 
     write-host "No more files to delete" -forgroundcolor "Green" 
    } 
} 
+0

この回答に間違いがありますか?なぜdownvotes? – user3282276

+1

正常に動作しますが、PowerShellの機能は使用しません。 – PseudoToad

+0

また、 '$ Files'が空であれば* foreach *文を入力しないので、* else *文には到達しません。 foreachを* if *文に入れるべきです。 – Dieter

12

単に(PowerShellのV5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force 
3

Esperento57のスクリプトが古いPowerShellのバージョンでは動作しません。この例ではありません:

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt (Get-Date).AddDays(-15)) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue 
+0

あなたもディレクトリを削除する例を示しています。 – Esperento57

+1

ディレクトリを除外する答えを更新しました。ありがとう。 – KERR

1

別の方法(15が自動的に[タイムスパン]に入力された取得):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose 
関連する問題