Powershell: ошибка при добавлении пользовательского объекта в список. Программа работает без ошибок в режиме отладки

Попытка разобрать текстовый файл с помощью PowerShell и создать список разделов, присутствующих в файле. При выполнении приведенного ниже фрагмента кода возникает ошибка при добавлении объекта в список.

Вызов метода завершился неудачно, так как [System.Management.Automation.PSObject] не содержит метод с именем op_Addition.

Первый объект добавляется в список, но выдается ошибка второго объекта. Интересно, что ошибка не возникает, если программа работает в режиме отладки.

function Process-Master-File {
    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline = $true)][String[]]$PipeValue
    )
    Begin { 
        #create new section object
        $codeSection = New-Object -TypeName psobject
        $codeSection | Add-Member -MemberType NoteProperty -Name Name -Value $null
        $codeSection | Add-Member -MemberType NoteProperty -Name SuppresionGroup -Value $null
        $codeSection | Add-Member -MemberType NoteProperty -Name Mandatory -Value $False
        $codeSection | Add-Member -MemberType NoteProperty -Name SectionBody -Value $null
        [string]$out = ""
    }
    Process {
        # Grab a line from the pipe
        [string]$line = $_

        # Find positions
        try {
            $pos = 0
            $pos = $line.IndexOf('@Section')
            if ($pos[0] -ne -1) { 
                if ($objTemp.Name) {
                    $objTemp.SectionBody = $section
                    $codeSectionList += $objTemp # Error is thrown here
                    $section = ""
                }

                $objTemp = $codeSection | Select-Object *
                $objTemp.Name = $line.Substring($line.LastIndexOf(':') + 1).TrimEnd().TrimStart()
                $objTemp.SuppresionGroup = $line.Substring($line.IndexOf('@SG') + 3, ($line.LastIndexOf(':') - $line.IndexOf('@SG') - 3)).TrimEnd().TrimStart()
                if ($line.IndexOf('@Mandatory') -ne -1) {
                    $objTemp.Mandatory = $True
                }
                $section = $line
                Write-Verbose $line
            }
            else {
                $section += $line
            }
        }
        Catch {
            Write-Host "An error occurred while processing file:"
            Write-Host $_
        }
    }
    End {
        $codeSectionList
    }
}

person Madhur Sharma    schedule 11.04.2020    source источник
comment
Переменная $codeSectionList используется, но не определена (как и $objTemp).   -  person JosefZ    schedule 11.04.2020
comment
ПОЖАЛУЙСТА, опубликуйте полный текст ошибки. PoSh обычно содержит некоторую полезную информацию в этом тексте. когда вы это сделаете, добавьте его в свой вопрос и оберните его форматированием кода, чтобы каждый мог его увидеть и легко прочитать. [усмехнуться]   -  person Lee_Dailey    schedule 11.04.2020


Ответы (1)


Вы должны инициализировать $codesectionlist как массив. В противном случае вы пытаетесь добавить один pscustomobject к другому.

$codesectionlist += [pscustomobject]@{name='Joe'}
$codesectionlist += [pscustomobject]@{name='John'}

InvalidOperation: Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.

$codesectionlist.gettype().fullname
System.Management.Automation.PSCustomObject


$codesectionlist = @()
$codesectionlist += [pscustomobject]@{name='Joe'} 
$codesectionlist += [pscustomobject]@{name='John'}

$codesectionlist.gettype().fullname
System.Object[]

Глобальная переменная могла быть включена в вопрос. Сценарий использует собственную область действия сценария с оператором +=. Отладка похожа на точечный поиск сценария.

cat script.ps1
$a += 1
$a += 2
$a

$global:a = @()

.\script
3

. .\script
1
2

Как ни странно, $a = $a + 1 работает иначе, чем $a += 1 с точки зрения области действия.

cat ./script.ps1
$a
$a = $a + 1
$a = $a + 2
$a

$global:a = @()

./script
1
2

На самом деле я использовал скрипт вместо функции, но все остается в силе.

О, это верно. Это ошибка, которую я опубликовал в декабре прошлого года: +=, functions и global variable #11297

person js2010    schedule 11.04.2020
comment
Спасибо @js2010, ваше решение дало мне понять, где я ошибался. На самом деле я инициализировал $codesectionlist как массив в другом месте, где в коде с помощью $global:codesectionlist = @() я переместил этот раздел в блок Begin. Это все еще не сработало. Затем я удалил ключевое слово Global, и это сработало! Все еще не уверен, почему ключевое слово global вызывало проблему или почему запуск старого скрипта с точкой отладки не приводил к ошибке! - person Madhur Sharma; 12.04.2020