【问题标题】:Delete files recursively with PowerShell使用 PowerShell 递归删除文件
【发布时间】:2012-09-04 21:57:29
【问题描述】:

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

我正在查看 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"

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

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

【问题讨论】:

    标签: powershell windows-server-2008


    【解决方案1】:

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

    【讨论】:

    • 我想补充一点,如果您正在寻找 7 天前的东西,您可以使用(Get-Date).AddDays(-7) 来做一个更可变的日期。
    【解决方案2】:

    顺便说一句,这就是您在 PowerShell 3.0 中执行相同操作(仅获取文件)的方式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多