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

Gar*_*rty 3 powershell powershell-v4.0

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
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢。

Tim*_*ner 6

您可以添加一个额外的 where 子句来忽略这样的文件夹:

Where-Object{!($_.PSIsContainer)}
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中;

  • ! 不是的意思,
  • $_ 表示管道中对象的当前值,
  • 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
Run Code Online (Sandbox Code Playgroud)

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

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

这种方法的好处是在执行周期中更快地返回文件对象并使命令行更短。根据路径中对象的数量,这也可能具有可测量的速度改进。