我正在使用自定義函數在8TB驅動器(數千個文件)上實質上執行DIR命令(遞歸文件列表)。如何使用Powershell管道避免大型對象?
我的第一次迭代是:
$results = $PATHS | % {Get-FolderItem -Path "$($_)" } | Select Name,DirectoryName,Length,LastWriteTime
$results | Export-CVS -Path $csvfile -Force -Encoding UTF8 -NoTypeInformation -Delimiter "|"
這導致了巨大的$結果變量,減緩了系統崩潰到爬行通過扣球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'? – briantist
不要收集所有對象,然後處理。相反,輸出你走。 –
可能是[Get-FolderItem](https://gallery.technet.microsoft.com/scriptcenter/Get-Deeply-Nested-Files-a2148fd7)在中間。這是一件很好的工作,但它依賴於解析'robocopy'輸出。嘗試使用[AlphaFS](https://github.com/alphaleonis/AlphaFS/wiki/PowerShell)(請參閱*示例:模擬Get-ChildItem以克服鏈接頁面上的「Path Too Long」*)。 – beatcracker