【发布时间】:2017-07-11 15:27:18
【问题描述】:
我正在使用自定义函数在 8TB 驱动器(数千个文件)上执行 DIR 命令(递归文件列表)。
我的第一次迭代是:
$results = $PATHS | % {Get-FolderItem -Path "$($_)" } | Select Name,DirectoryName,Length,LastWriteTime
$results | Export-CVS -Path $csvfile -Force -Encoding UTF8 -NoTypeInformation -Delimiter "|"
这导致了一个巨大的 $results 变量,并通过使 powershell 进程在处理过程中使用 99%-100% 的 CPU 来减慢系统速度。
我决定使用管道的力量直接写入 CSV 文件(大概是释放内存)而不是保存到中间变量,并想出了这个:
$PATHS | % {Get-FolderItem -Path "$($_)" } | Select Name,DirectoryName,Length,LastWriteTime | ConvertTo-CSV -NoTypeInformation -Delimiter "|" | Out-File -FilePath $csvfile -Force -Encoding UTF8
这似乎工作正常(CSV 文件正在增长..CPU 似乎很稳定)但是当 CSV 文件大小达到 ~200MB 时突然停止,控制台的错误是“管道已停止”。
我不确定 CSV 文件大小与错误消息有什么关系,但我无法用任何一种方法处理这个大目录!有关如何让此过程成功完成的任何建议?
【问题讨论】:
-
你使用
ConvertTo-Csv | Out-File而不是Export-Csv有什么具体原因吗? -
不要收集所有对象然后处理。相反,你可以随时输出。
-
可能是Get-FolderItem 闯入了中间。这是一项不错的工作,但它依赖于解析
robocopy输出。尝试在链接页面上使用AlphaFS(请参阅示例:模拟 Get-ChildItem 以克服“路径过长”)。
标签: powershell export-to-csv pipeline