Powershell:将自定义对象添加到列表时出错。程序在调试模式下运行无误
Powershell: Error while adding custom object to a list. Program runs without error in debug mode
正在尝试使用 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
}
}
您必须将 $codesectionlist 初始化为一个数组。否则,您正在尝试将一个 pscustomobject 添加到另一个 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
实际上我使用的是脚本而不是函数,但一切仍然适用。
哦,对了。这是我去年 12 月发布的错误:+=, functions, and global variables #11297
正在尝试使用 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
}
}
您必须将 $codesectionlist 初始化为一个数组。否则,您正在尝试将一个 pscustomobject 添加到另一个 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
实际上我使用的是脚本而不是函数,但一切仍然适用。
哦,对了。这是我去年 12 月发布的错误:+=, functions, and global variables #11297