我的问题与metafilter上发布的问题几乎相同。
我需要使用PowerShell脚本来扫描大量文件。问题是,似乎“Get-ChildItem”函数坚持要将整个文件夹和文件结构推迟到内存中。由于驱动器在超过30,000个文件夹中有超过一百万个文件,因此该脚本需要大量内存。
我需要的只是文件的名称,大小和位置。
我现在所做的是:
$filesToIndex = Get-ChildItem -Path $path -Recurse | Where-Object { !$_.PSIsContainer }
它有效,但我不想惩罚我的记忆: - )
祝你好运, greenhoorn
答案 0 :(得分:2)
如果要优化脚本以减少内存使用,则需要正确使用管道。你正在做的是将Get-ChildItem -recurse的结果保存到内存中,所有这些!你能做的就是这样:
Get-ChildItem -Path $Path -Recurse | Foreach-Object {
if (-not($_.PSIsContainer)) {
# do stuff / get info you need here
}
}
这样您总是通过管道传输数据,您将看到PowerShell将消耗更少的内存(如果正确完成)。
答案 1 :(得分:1)
您可以做的一件事就是通过将它们削减到您感兴趣的属性来减少保存对象的大小。
$filesToIndex = Get-ChildItem -Path $path -Recurse |
Where-Object { !$_.PSIsContainer } |
Select Name,Fullname,Length