删除子文件夹中x天前的文件

4
我正在尝试删除给定文件夹下所有子文件夹中的文件,但不想删除子文件夹本身。我已经尝试了各种示例,但它们没有按照我的预期执行。
我要操作的文件树的基本结构如下:
C:\Backups\Subfolder1 C:\Backups\Subfolder2 C:\Backups\Subfolder3
我正在使用以下代码:
$limit = (Get-Date).AddDays(-14)
$path  = "C:\Backups"

Get-ChildItem -Path $path -Recurse -Force |
    Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } |
    Remove-Item -WhatIf

我发现子目录中的文件被忽略了,尽管使用了-Recurse标志,但C:\Backups目录中的任何文件都包括在内。如果我删除!$_.PSIsContainer子句,则子文件夹中的文件将被包括在内,但所有目录也将被包括在内。

有人能告诉我如何在仍然忽略子文件夹本身的情况下包括子文件夹中的文件吗?


3
我没有看到您代码中的错误,这应该可以正常运行... 您是否知道您正在使用-WhatIf标志,并且没有任何文件会被实际删除? - Martin Brandl
是的,我知道。目前我只是在验证哪些文件被删除了。 - Duncan
在将“lt”更改为“gt”后,因为我无法使用两周前创建的文件重现,它对我也起作用了。“如果:在目标“C:\Backups\Subfolder1\Test.txt”上执行“删除文件”操作。” - BenH
@BenH $f = New-Item 'C:\path\to\file' -Type File; $f.CreationTime = $f.CreationTime.AddDays(-21) - Ansgar Wiechers
@AnsgarWiechers 谢谢,我想我应该更准确地表达,因为我懒得修改创建时间而不是改变一个字母。希望脚本的意图仍然清晰明了。 - BenH
3个回答

1
如果您正在使用PowerShell 3.0,则可以简单地使用“-File”开关:
$limit = (Get-Date).AddDays(-14)
$path = "C:\Backups"
Get-ChildItem -Path $path -File -Recurse | where { $_.LastWriteTime -lt $limit } | Remove-Item

0
$limit = (Get-Date).AddDays(-14)
$files = Get-ChildItem -Path C:\Backups -Directory:$false -Recurse
$files | ForEach-Object -Process {
  if($_.CreationTime -lt $limit)
  {
    Remove-Item $_.FullName -Force
  }  
}

-Directory:$False参数意味着您无需担心删除任何目录,因为它们不会包含在数组中。


-Directory:$False 参数意味着您无需担心删除任何目录,因为它们不会包含在数组中。 - Michael Noe
你应该将这个作为答案的编辑添加进去,因为评论并不总是被阅读并且不能保证保存。此外,如果能多加一点解释,你的答案可能会更有用。 - Alexander Morley
我使用这种方法仍然没有成功,目录仍然被包括进来。然而,进一步的研究让我找到了这个解决方案:'code' $files2 = Get-ChildItem -Path $path -Recurse -Attributes !D,这确实实现了忽略目录的目标。 - Duncan

0
以下代码对我有效。您使用的PowerShell版本比较老吗?
$limit = (Get-Date).AddDays(-14)
$path  = "C:\Users\nathan.cooper\Documents"
Get-ChildItem -Path $path -Recurse -Force | 
  where { (! $_.PSIsContainer) -and ($_.LastWriteTime -lt $limit) } |
  Remove-Item -whatif

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