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
是当前对象的属性,它返回true
或false
取决于它是否是文件夹。
所以!($_.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
这种方法的好处是可以在执行周期的较早时间点返回文件对象,并使命令行更短。根据路径中的对象数量,这也可能带来可观的速度提升。