PowerShell脚本数组触发System.OutOfMemoryException异常怎么解决
问题判断结论
你的判断部分正确,但除了数组大小超出2GB限制外,还有更核心的性能问题:你使用的$results += $temp数组追加操作是典型的低效写法,PowerShell数组是固定长度的,每次执行+=都会重新申请一块更大的内存、拷贝原有所有数组元素再追加新元素,数据量较大时内存占用会呈指数级上涨,再加上你同时在内存中驻留了$publicFolders全量数据、$results权限结果集、$final重复结果集三个大对象集合,进一步加剧了内存消耗。
不需要扩容内存,通过流式迭代处理完全可以规避该问题,优化后内存占用可以降到原来的1%不到。
优化后脚本
$Path = "path to output" # 直接流式处理公共文件夹查询结果,不把全量数据存入变量占用内存 Get-PublicFolder "Public Folder Name" -Recurse -resultsize unlimited | ForEach-Object { $pf = $_ $perms = Get-PublicFolderClientPermission -Identity $pf.Identity | Where-Object {$_.User -notmatch "Default|Anonymous|S-X-X-XX"} foreach($perm in $perms){ # 直接输出自定义对象,不需要存入中间数组 [PSCustomObject]@{ MailFolderName = $pf.Identity UserWithPerms = $perm.User AccessRights = $perm.AccessRights } } } | Export-Csv $Path -NoTypeInformation
核心优化点
- 移除了
$results +=的低效数组追加操作,彻底避免数组重复拷贝带来的超额内存开销 - 全程采用流式处理:查询到的公共文件夹直接逐行处理,处理生成的权限结果直接逐行输出到CSV文件,不需要把所有权限结果都驻留在内存中
- 删除了冗余的
$results、$final两个重复存储结果的变量,避免多份数据重复占用内存
如果后续需要处理超大规模(百万条以上)的权限导出,还可以增加分批拉取公共文件夹、分批落盘的逻辑,进一步稳定内存占用,完全不需要靠扩容内存解决问题。
内容的提问来源于stack exchange,提问作者Techknow
相关产品推荐
相关产品推荐

