2012-09-11 59 views
4

我需要基於它們的上次訪問時間刪除所有文件(遞歸地在所有文件夾和子文件夾中)。使用PowerShell遞歸刪除文件

我一直在尋找在堆棧溢出後Batch file to delete files older than N days,暗示這樣的回答:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path" 

然而,這將刪除基於上次修改時間的文件,而不是上次訪問時間。

另外,有沒有辦法將命令保存在腳本文件中,以便我可以雙擊它來運行?

回答

7

使用Get-ChildItem -recurse讓所有的文件,然後你可以管他們向where-object命令行過濾掉的目錄和使用LastAccessTime屬性過濾基於該屬性。然後,將結果傳遞給執行delete命令的foreach對象。

它看起來像這樣。注意使用獲取最新的,獲得自今年開始更新了所有的文件,用自己的日期替換:

get-childitem C:\what\ever -recurse | where-object {-not $_.PSIsContainer -and ($_.LastAccessTime -gt (get-date "1/1/2012"))} | foreach-object { del $_ } 

或者用一些常見的別名,以縮短的一切:

dir C:\what\ever -recurse | ? {-not $_.PSIsContainer -and ($_.LastAccessTime -gt (get-date "1/1/2012"))} | % { del $_ } 
+2

我想補充,如果你正在尋找的東西,是7天前,你可以使用'(Get-Date).AddDays(-7)'做一個更可變的日期。 – Nick

4

順便說一句,這是你會怎麼做同樣的(只得到文件)的PowerShell 3.0:

$old = Get-Date "1/1/2012" 

Get-ChildItem C:\what\ever -File -Recurse | 
Where-Object {$_.LastAccessTime -gt $old} | 
Remove-Item -Force