#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. Я проверил файлы, которые выдавали ошибку. По моим наблюдениям, все выглядит нормально — я собираюсь добавить еще одну проверку, чтобы проверить то или иное. Вы, вероятно, правы…