如何获取并导出NTFS权限?大共享目录内存占用过高求助
NTFS权限采集脚本内存占用过高的优化方案
问题根源
你当前的脚本会将所有文件/目录的NTFS权限数据全量存入$NTFS变量,需等递归遍历完全完成后才导出到CSV。当目录规模较大时,大量数据持续驻留内存,必然导致内存占用飙升。
优化方案
1. 流式处理:边遍历边导出(推荐)
直接通过管道实时将结果写入CSV,无需将所有数据存储在变量中,从根源避免内存堆积:
# Root Share or Root path $RootShare = '<\Share>' # 先导出根目录权限 Get-NTFSAccess -Path $RootShare | Export-Csv -Path 'C:\Temp\File.csv' -NoTypeInformation # 递归遍历子项,边获取权限边追加到CSV Get-ChildItem -Path $RootShare -Recurse | ForEach-Object { Get-NTFSAccess -Path $_.FullName #-ExcludeInherited #按需启用该参数过滤继承权限 } | Export-Csv -Path 'C:\Temp\File.csv' -NoTypeInformation -Append
2. 关闭并行遍历(PowerShell 7+适用)
PowerShell 7及以上版本的Get-ChildItem默认并行处理目录,可能加剧内存压力,可手动关闭并行:
Get-ChildItem -Path $RootShare -Recurse -Parallel:$false | ForEach-Object { Get-NTFSAccess -Path $_.FullName } | Export-Csv -Path 'C:\Temp\File.csv' -NoTypeInformation -Append
3. 分批处理(需临时加工数据时使用)
通过控制批次大小,限制内存中同时存在的数据量:
$RootShare = '<\Share>' $batchSize = 1000 # 可根据内存情况调整批次大小 # 先导出根目录权限 Get-NTFSAccess -Path $RootShare | Export-Csv -Path 'C:\Temp\File.csv' -NoTypeInformation $counter = 0 $batch = @() Get-ChildItem -Path $RootShare -Recurse | ForEach-Object { $batch += Get-NTFSAccess -Path $_.FullName $counter++ # 达到批次大小则写入文件并清空批次 if ($counter -eq $batchSize) { $batch | Export-Csv -Path 'C:\Temp\File.csv' -NoTypeInformation -Append $batch = @() $counter = 0 } } # 导出剩余未完成的批次 if ($batch.Count -gt 0) { $batch | Export-Csv -Path 'C:\Temp\File.csv' -NoTypeInformation -Append }
4. 过滤冗余权限项
启用-ExcludeInherited参数,只导出显式配置的权限,可大幅减少数据总量:
Get-NTFSAccess -Path $_.FullName -ExcludeInherited
内容的提问来源于stack exchange,提问作者Shepard
相关产品推荐
相关产品推荐

