2

我正在尝试在 powershell 中创建一组自定义对象并将它们存储在哈希表中。问题是当我将对象放入哈希表时自定义属性消失了。

$customObject = New-Object object

$customObject | Add-member -membertype noteproperty -name customValue -value "test"

Write-Host $customObject.customValue

$hashTable = @{}

$hashTable.add("custom", $customObject)

$object = $hashTable["custom"]

$object.customValue = 7

当我执行此代码时,我得到以下输出。

test
Property 'customValue' cannot be found on this object; make sure it exists and is settable.
At C:\temp\test2.ps1:15 char:9
+ $object. <<<< customValue = 7
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

将自定义属性放入集合后,有什么方法可以使用它吗?

4

1 回答 1

4

我在 64 位 Windows 7 上使用 PowerShell 3.0。在 3.0 中,您的代码按预期运行,但在 2.0 ( powershell.exe -Version 2.0) 中,我遇到与您相同的错误。真正奇怪的是 2.0 下的这个输出:

PS> [Object]::ReferenceEquals($customObject, $object)
True
PS> $customObject | Get-Member


   TypeName: System.Object

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
customValue NoteProperty System.String customValue=test


PS> $object | Get-Member


   TypeName: System.Object

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()

因此,PowerShell 同意它们是同一个对象,但只有一个具有customValue属性。我还注意到,如果我改变你从这个添加的$customObject方式$hashTable......

$hashTable.add("custom", $customObject)

……到这……

$hashTable["custom"] = $customObject

...然后您的代码在 PowerShell 2.0 下按预期工作。因此,似乎在调用 时出现了问题Add(),并且该行为必须已在 3.0.0 中修复。

另一个解决方法是从这里更改第一行......

$customObject = New-Object object

……到这……

$customObject = New-Object PSObject

...并且您的代码在两个版本的 PowerShell 中都可以正常运行。然后,您可以将前两行缩短为此...

$customObject = New-Object PSObject -Property @{ customValue = "test" }
于 2013-08-14T20:23:26.680 回答