You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取并导出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:38:21