使用PowerShell递归删除文件

时间:2012-09-11 22:14:02

标签: powershell windows-server-2008

我需要根据上次访问时间删除所有文件(在所有文件夹和子文件夹中递归)。

我在查看Stack Overflow帖子 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"

但是,这会根据上次修改时间删除文件,而不是上次访问时间。

另外,有没有办法将命令保存在脚本文件中,以便我可以双击它来运行?

2 个答案:

答案 0 :(得分:7)

使用Get-ChildItem -recurse获取所有文件,然后可以将它们传递给where-object命令行开关以过滤掉目录,并使用LastAccessTime属性根据该属性进行过滤。然后将结果传递给执行delete命令的foreach对象。

最终看起来像这样。请注意使用Get-Date来获取自年初以来更新的所有文件,替换为您自己的日期:

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 $_ }

答案 1 :(得分: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