无法在存在的对象上找到属性

时间:2013-06-11 14:14:29

标签: powershell powershell-v2.0

我有一个对象数组,我正试图操纵它,并且收到一个错误,即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 个答案:

答案 0 :(得分:4)

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

Set-StrictMode -Off

结果如下:

Get-Member -InputObject $AllContents

Get-Member -InputObject $AllContents[0].RptFile

答案 1 :(得分:3)

先尝试

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

如果没有这样的东西应该有帮助:

[Your.Interface.Implemented.Explicitly].GetProperty("RptFile").SetValue($AllContents[0], '<value>',$null)

答案 2 :(得分:1)

$rptFile = $AllContents | Select -Expand RptFile | Where { $_ eq 'CB-Officer Trial New' } 

答案 3 :(得分:1)

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

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

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中的元素为数组而不是单个对象的情况(或在某些情况下导致这种情况,例如假设先前的命令在返回时仅返回一个对象)返回许多对象。)