用Powershell检查很多文件夹

时间:2012-09-10 14:00:00

标签: memory powershell foreach internal subdirectory

我的问题在于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个文件夹,之后才开始过滤它们。

是否有可能阻止这种情况?

1 个答案:

答案 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)上操作的参数,因此您可以通过管道发送所有内容使用这些中间对象(会占用更多内存)。