使用PowerShell递归删除文件

4

我需要根据文件的最后访问时间递归地删除所有文件(包括文件夹和子文件夹中的所有文件)。

我看了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个回答

7
使用Get-ChildItem -recurse获取所有文件,然后将它们导入到where-object命令中来过滤出目录,并使用LastAccessTime属性根据该属性进行筛选。 然后,将结果导入管道到一个执行删除命令的foreach-object中。
最终代码如下所示。请注意,使用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 $_ }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接