使用 powershell 仅删除留下空子文件夹的文件

使用 powershell 仅删除留下空子文件夹的文件

C:\Temp\ifc 内有大约 297 个文件夹,其中分布着大约 410 万个文件。

使用我在本网站其他地方找到的脚本,我编写了以下内容以删除所有超过 1 小时的“文件”。

$TargetFolder = “C:\Temp\ifc”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item

我遇到的问题是它也会删除子文件夹(如果这些文件夹中没有文件)。

我可以添加什么内容以便保留文件夹结构?

非常感谢。

答案1

您可以添加额外的 where 子句来忽略文件夹,如下所示:

Where-Object{!($_.PSIsContainer)}

在上面的代码片段中;

  • !表示不,
  • $_表示管道中对象的当前值,
  • PSIsContainer是当前对象的属性,它返回truefalse取决于它是否是文件夹。

所以!($_.PSIsContainer)意味着管道中对象的当前值不是文件夹,
其评估方式如下Where-Object{}

那么你的脚本将会是这样的:

$TargetFolder = “C:\Temp\ifc\”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -Recurse | Where-Object{!($_.PSIsContainer)} | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item

另一种方法是忽略调用时Get-ChildItem使用的-File参数的文件夹,如下所示:

$TargetFolder = “C:\Temp\ifc\”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -File -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item

这种方法的好处是可以在执行周期的较早时间点返回文件对象,并使命令行更短。根据路径中的对象数量,这也可能带来可观的速度提升。

相关内容