OutOfMemoryException при запуске моего сценария PowerShell - PullRequest
3 голосов
/ 15 ноября 2011

Вот скрипт PowerShell, который я использую, чтобы добавить «сегмент99» в начало всех текстовых файлов (по одному) в папке:

Set Environmental Variables:

$PathData = '<<ESB_Data_Share_HSH>>\RwdPnP'

Go to each text file in the specified folder and add header to the file:

Get-ChildItem $PathData -filter 'test_export.txt'|%{

$content = '"segment99" ' + [io.file]::ReadAllText($_.FullName)
[io.file]::WriteAllText(($_.FullName -replace '\.txt$','_99.txt'),$content)

}

Это дает мне следующую ошибку:

Error: Exception calling "ReadAllText" with "1" argument(s): "Exception of type 'Syste
Error: m.OutOfMemoryException' was thrown."
Error: At D:\apps\MVPSI\JAMS\Agent\Temp\JAMSTemp13142.ps1:17 char:51
Error: + $content = '"segment99" ' + [io.file]::ReadAllText <<<< ($_.FullName)
Error:     + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
Error:     + FullyQualifiedErrorId : DotNetMethodException
Error:

Я выполняю этот код в папке, содержащей 20 файлов, каждый размером более 2 ГБ.

Как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Копирование файла заголовка + большой файл в новый файл будет менее подвержено исключениям вне памяти (для файлов такого размера):

$header = '"segment99"'
$header | out-file header.txt -encoding ASCII
$pathdata = "."
Get-ChildItem $PathData -filter 'test_export.txt' | %{
  $newName = "{0}{1}{2}" -f $_.basename,"_99",$_.extension
  $newPath = join-path (split-path $_.fullname) $newname
  cmd /c copy /b "header.txt"+"$($_.fullname)" "$newpath"
}
2 голосов
/ 15 ноября 2011

Это не оптимальный код, но он решает задачу без чтения всего текста в память: он добавляет заголовок к первой строке, а затем выводит другие строки. Также обратите внимание, что он ничего не делает, если входной файл пуст.

Get-ChildItem $PathData -Filter 'test_export.txt' | %{
    $header = $true
    Get-Content $_.FullName | .{process{
        if ($header) {
            '"segment99" ' + $_
            $header = $false
        }
        else {
            $_
        }
    }} | Set-Content ($_.FullName -replace '\.txt$', '_99.txt')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...