Я использую пользовательскую функцию, чтобы по существу выполнить команду DIR (рекурсивный список файлов) на диске 8 ТБ (тысячи файлов).Как использовать Pipershell Pipeline, чтобы избежать крупных объектов?
Моей первая итерация была:
$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 рос. и процессор казался стабильным), но затем резко остановился, когда размер файла CSV достиг ~ 200 МБ, а ошибка на консоли была «Конвейер был остановлен».
Я не уверен, что размер файла 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 для преодоления «Слишком длинный путь» *) на связанной странице. – beatcracker