我的问题在于Powershell。 我有一个非常大的文件夹。 Insider约有1 600 000个子文件夹。 我的任务是清除超过6个月的所有空文件夹或文件。 我用foreach编写了一个循环,但是在PowerShell启动它之前需要很长时间 - >
...
foreach ($item in Get-ChildItem -Path $rootPath -recurse -force | Where-Object -FilterScript { $_.LastWriteTime -lt $date })
{
# here comes a script which will erase the file when its older than 6 months
# here comes a script which will erase the folder if it's a folder AND does not have child items of its own
...
问题:我的内存已满(4GB),我再也无法正常工作了。 我的猜测:powershell加载了所有1 600 000个文件夹,之后才开始过滤它们。
是否有可能阻止这种情况?
答案 0 :(得分:0)
您是对的,所有1.6M文件夹或至少是对它们的引用都是一次加载的。最佳做法是过滤左和右;格式正确; IOW,如果可能的话,请在Where-Object
之前删除这些文件夹(不幸的是,gci
不支持日期过滤器AFAICT)。此外,如果你把东西放在管道中,你将使用更少的内存。
以下内容仅将$items
限制为符合条件的文件夹,然后对这些对象执行循环。
$items = Get-ChildItem -path $rootpath -recurse -force | ?{ $_.LastWriteTime -lt $date }
foreach ($item in $items) {
# here comes a script which will erase the file when its older than 6 months
# here comes a script which will erase the folder if it's a folder AND does not have child items of its own
}
或进一步精简:
function runScripts {
# here comes a script which will erase the file when its older than 6 months. Pass $input into that script. $input will be a folder.
# here comes a script which will erase the folder if it's a folder AND does not have child items of its own Pass $input into that script. $input will be a folder.
}
Get-ChildItem -path $rootpath -recurse -force | ?{ $_.LastWriteTime -lt $date }|runScripts
在最后一种情况下,您使用runScripts
作为一个函数,它使用流水线对象作为可以在($input
)上操作的参数,因此您可以通过管道发送所有内容使用这些中间对象(会占用更多内存)。