2013-07-24 71 views
130

我想只刪除超過15天前在特定文件夾中創建的文件。我怎樣才能使用PowerShell來做到這一點?使用PowerShell刪除超過15天的文件

+2

大部分的答案使用CREATIONTIME但是它會當一個文件被拷貝重置,所以你可能不得到你想要的結果。 LastWriteTime是與Windows資源管理器中的「修改日期」對應的內容。 –

回答

6

試試這個:

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

我相信最後一個'-recurse'太多了,不是嗎?目錄列表是遞歸的,刪除的項目不應該包括孩子,對吧? – Joost

+0

是的,你是對的 – RayofCommand

+0

如果你正在使用的目錄是兩個目錄深的第二 - 流氓需要。 –

12

基本上,你遍歷文件指定路徑下,減去從當前時間找到的每個文件的CreationTime,並與之比較的結果的Days財產。該-WhatIf交換機會告訴你並沒有實際刪除的文件(文件將被刪除)會發生什麼,刪除開關實際刪除文件:

$old = 15 
$now = Get-Date 

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

另一種方式是從當前日期減去15天,比較CreationTime針對值:

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

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

給出的答案只會刪除文件(這誠然是什麼在這篇文章的標題),但這裏的一些代碼,會先刪除所有的文件超過15天,然後遞歸刪除可能留下的空目錄。我的代碼也使用-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 

,如果你想看到什麼文件/文件夾將實際刪除它們之前被刪除,當然還有,你可以在兩行的末尾添加-WhatIf切換到Remove-Item cmdlet的電話。

此處顯示的代碼與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

此外,它永遠不會到達* else *語句,因爲如果'$ Files'爲空,它將不會進入* foreach *語句。 您應該將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