超15TB文件服务器使用Get-ChildItem查询内存过高如何导出CSV
大文件系统Get-ChildItem内存过高的流式写入解决方案
你当前使用的命令会将所有遍历到的文件/文件夹对象全部存储到$FSData变量中,15TB数据对应的元数据总量远超过16GB内存的承载上限,自然会出现内存占用过高的问题。
核心解决方案:使用管道流式处理
PowerShell的管道支持逐对象传递处理,无需等待全部遍历完成再写入文件,每获取到一个文件/文件夹对象就直接写入磁盘,全程内存占用可稳定在几十MB级别。
基础流式写入CSV命令
如果你需要保留文件/文件夹的核心属性(路径、类型、大小、修改时间等),直接使用以下命令即可:
Get-ChildItem -Path C:\FS01 -Recurse -Force -ErrorAction SilentlyContinue | Select-Object FullName, PSIsContainer, Length, LastWriteTime | Export-Csv -Path "C:\FS01_File_List.csv" -NoTypeInformation -Encoding UTF8
说明:
-ErrorAction SilentlyContinue参数用于跳过无权限访问的路径,避免遍历中断,不需要可以直接删除。
仅需要完整路径的精简方案
如果只需要导出所有文件和文件夹的完整路径,不需要额外属性,可以使用更轻量的写入方式,内存占用更低:
Get-ChildItem -Path C:\FS01 -Recurse -Force -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName | Out-File -Path "C:\FS01_Full_Path_List.txt" -Encoding UTF8
低版本PowerShell兼容方案
如果服务器运行的是PowerShell 5.0以下的旧版本,Export-Csv仍可能出现内存堆积的情况,可以改用手动逐行追加写入的方式:
# 先写入CSV表头 "FullPath" | Out-File -Path "C:\FS01_Path_List.csv" -Encoding UTF8 # 逐行追加路径 Get-ChildItem -Path C:\FS01 -Recurse -Force -ErrorAction SilentlyContinue | ForEach-Object { "`"$($_.FullName)`"" | Out-File -Path "C:\FS01_Path_List.csv" -Encoding UTF8 -Append }
该方案兼容性最强,内存占用最低,仅遍历速度会略低于原生管道流式处理,完全适配15TB级别的文件系统遍历场景。
内容的提问来源于stack exchange,提问作者Jimcesseg
相关产品推荐
相关产品推荐

