7

我有一个对象数组,并试图对其进行操作,并收到属性 RptFile 不存在的错误。我检查了拼写和所有内容,对发生的事情感到困惑。

给出错误的代码:

$AllContents | Where-Object {$_.RptFile -eq 'CB-Officer Trial New'} 

AllContents | Get-Member returns:


TypeName: Selected.System.Management.Automation.PSCustomObject

Name         MemberType   Definition                                            
----         ----------   ----------                                            
Equals       Method       bool Equals(System.Object obj)                        
GetHashCode  Method       int GetHashCode()                                     
GetType      Method       type GetType()                                        
ToString     Method       string ToString()                                     
RptFile      NoteProperty System.String RptFile=ABL - Branch5206 Daily OD Report
TotalSeconds NoteProperty System.String TotalSeconds=25   

所以该属性确实存在。知道发生了什么吗?如果我只输入 $AllContents,我也会得到一个包含该属性的列表。

4

4 回答 4

4

Set-StrictMode可以测试以在代码之前删除严格模式的价值是什么?

Set-StrictMode -Off

结果是什么:

Get-Member -InputObject $AllContents

Get-Member -InputObject $AllContents[0].RptFile
于 2013-06-11T15:46:10.263 回答
3

先试试

$AllContents[0].RptFile = '<value>'

如果不是这样的事情应该有帮助:

[Your.Interface.Implemented.Explicitly].GetProperty("RptFile").SetValue($AllContents[0], '<value>',$null)
于 2014-02-04T13:41:19.613 回答
2

我不确定这是否会有所帮助,而且我确信这类似于线程死灵法,但我遇到了同样的问题,这是谷歌上的第一个结果。

我用以下代码创建了同样的问题:

Class A_Class
{
    [String] $AProperty

    A_Class()
    {
        $this.AProperty = "Something"
    }
}

Class Collection_Of_A_Class
{
    [System.Collections.Generic.Dictionary[int,A_Class[]]] $Objects #a dictionary, where i intended each entry to be a A_Class, but which is defined as an array of A_Class

    Collection_Of_A_Class()
    {
        $this.Objects = New-Object 'System.Collections.Generic.Dictionary[[int], A_Class[]]]'
    }

    [void]AddObject()
    {
        $this.Objects.Add(0,[A_Class]::New())
    }
}

$myCollection = [Collection_Of_A_Class]::New()

$myCollection.AddObject()

$myCollection.Objects[0].AProperty = "SomethingElse"

基本上,我试图访问数组成员的属性,就好像它是一个对象一样。因为字典的数据类型是硬类型的数组,所以它需要我的单个对象并强制它是一个数组。结果,我的财产(如所述)确实不存在。将字典定义更改为:

[System.Collections.Generic.Dictionary[int,A_Class]] $Objects

并实例化为:

$this.Objects = New-Object 'System.Collections.Generic.Dictionary[[int],[A_Class]]'

解决问题。

您还可以通过以下方式访问来解决问题:

$myCollection.Objects[0][0].AProperty = "SomethingElse"

在这种情况下,我访问了索引为 0 的字典对象,并且数组的元素 0 存储在那里。在这种情况下,该属性实际上存在(如已解决)。

我会检查您的代码是否存在导致 $AllContents 中的元素是数组而不是单个对象的情况(或者有时会导致这种情况,例如假设先前的命令在返回大量对象时只会返回一个对象)。

于 2018-10-03T20:16:03.503 回答
1
$rptFile = $AllContents | Select -Expand RptFile | Where { $_ eq 'CB-Officer Trial New' } 
于 2013-06-11T14:30:28.643 回答