Powershell выдает ошибку нехватки памяти (я думаю)

#powershell #error-handling

#powershell #обработка ошибок

Вопрос:

PowerShell выдает эту ошибку…

 Exception from HRESULT: 0x800A03EC
At line:23 char:14
               $diskSpacewksht.Cells.Item($col1,2) = [String]$Flowerbox
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : OperationStopped: (:) [], COMException
      FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
 

Строка 23 — это этот фрагмент кода..

 $diskSpacewksht.Cells.Item($col1,2) = [String]$Flowerbox
 

У меня более 10 тысяч файлов. В этих файлах есть описания того, что делают файлы. Описания находятся в цветочном ящике (куча заметок, окруженных звездочкой).
Общей темой для них является то, что все комментарии начинаются после «РАЗДЕЛЕНИЯ ИДЕНТИФИКАЦИИ» и заканчиваются перед «РАЗДЕЛЕНИЕМ СРЕДЫ»

Итак, я загружаю массив со всем, что нахожу из «*» и из 62 позиций. После того, как я записываю информацию Excel, я сбрасываю свой массив.

Из файлов 10K я получаю несколько сотен исключений, описанных выше, и не удается получить необходимые данные.

Я добавил некоторую обработку ошибок и сгенерировал расширенные сообщения ниже.

 PSItem.InvocationInfo..... System.Management.Automation.InvocationInfo
PSItem.Exception.......... System.OutOfMemoryException: Insufficient memory to continue the execution of the program.
   at System.Management.Automation.ComInterop.ComRuntimeHelpers.CheckThrowException(Int32 hresult, ExcepInfoamp; excepInfo, ComMethodDesc method, Object[] args, UInt32 argErr)
   at CallSite.Target(Closure , CallSite , ComObject , Object , Int32 , String )
   at <ScriptBlock>(Closure , FunctionContext )
PSItem.Exception.Message.. Insufficient memory to continue the execution of the program.
 

Есть идеи, почему я направляюсь на юг?
Вот мой сценарий….

 $excel = New-Object -ComObject excel.application
$excel.visible = $False
$workbook = $excel.Workbooks.Add()
$diskSpacewksht= $workbook.Worksheets.Item(1)
$diskSpacewksht.Name = "Descriptions"
$col1=1
$diskSpacewksht.Cells.Item(1,1) = 'Program'
$diskSpacewksht.Cells.Item(1,2) = 'Description'

$CBLFileList = Get-ChildItem -Path 'C:HOLD_Files' -Filter '*.cbl' -File -Recurse
$Flowerbox = @()

ForEach($CBLFile in $CBLFileList) {
    $Flowerbox = @()
    Write-Host "Processing ... $CBLFile" -foregroundcolor green      
    Get-content -Path $CBLFile.FullName |
    ForEach-Object {
        if ($_ -match 'IDENTIFICATION DIVISION') {
            $treat = $true
        }
        if ($_ -match 'ENVIRONMENT DIVISION') {
             $col1  
             $diskSpacewksht.Cells.Item($col1,1) = $CBLFile
             $diskSpacewksht.Cells.Item($col1,2) = [String]$Flowerbox
             $Flowerbox = @()
             continue
        }
        if ($treat) {
            if ($_ -match '*(.{62})') {
                Foreach-Object {$Flowerbox  = $matches[1]   "`r`n"}
            }
        }
    }
}

$excel.DisplayAlerts = 'False'
$ext=".xlsx"
$path="C:OUTPUT_RESULTSCaptured_Results_2$ext"
$workbook.SaveAs($path) 
$workbook.Close
$excel.DisplayAlerts = 'False'
$excel.Quit()
 

Ответ №1:

Я бы рекомендовал вам сбрасывать переменную $Flowerbox после каждого $ CBLFile.

Комментарии:

1. Привет @Dan Я добавил сброс (см. Код выше). Я все еще выдаю ошибку.

2. Единственная другая рекомендация — добавить больше выходных данных отладки, чтобы увидеть, что происходит с $Flowerbox в условном операторе ‘ENVIRONMENT DIVISION’. Добавьте точки останова, чтобы увидеть, что происходит на самом деле. Я подозреваю, что файл, который у вас есть, вызывает у вас проблемы и может иметь или не иметь разделителей конца строки, что может вызвать проблемы с памятью.

3. Я проверил файлы, которые выдавали ошибку. По моим наблюдениям, все выглядит нормально — я собираюсь добавить еще одну проверку, чтобы проверить то или иное. Вы, вероятно, правы…