C:\ Temp \ ifc里面有大约297个文件夹,其中大约有410万个文件。
使用我在本网站其他地方find的脚本,我写下了以下内容,删除所有大于1小时的“文件”。
$TargetFolder = “C:\Temp\ifc” $NumberRange = "-1" Get-ChildItem $TargetFolder -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item
我遇到的问题是,它也删除子文件夹(如果这些文件夹最终没有在其中的文件)。
我可以添加什么,以便它留下文件夹结构?
非常感谢。
你可以添加一个额外的where子句来忽略这样的文件夹:
Where-Object{!($_.PSIsContainer)}
在上面的代码片段中;
! 意思不是, $_表示pipe道中对象的当前值, PSIsContainer是当前对象的属性,它返回true或false取决于它是否是一个文件夹。 所以!($_.PSIsContainer)表示pipe道中对象的当前值不是一个文件夹,
这由Where-Object{}
那么你的脚本会是这样的:
$TargetFolder = “C:\Temp\ifc\” $NumberRange = "-1" Get-ChildItem $TargetFolder -Recurse | Where-Object{!($_.PSIsContainer)} | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item
另一种方法是在使用-File参数调用Get-ChildItem忽略文件夹,如下所示:
$TargetFolder = “C:\Temp\ifc\” $NumberRange = "-1" Get-ChildItem $TargetFolder -File -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item
这种方法有利于在执行周期中尽早返回文件对象,并缩短命令行。 根据path中的对象数量,这也可能具有可测量的速度改进。