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プロパティを持つのは 1 つだけです。$customObjectまた、これから追加する方法を変更すると$hashTable...

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

...これに...

$hashTable["custom"] = $customObject

...その後、コードは PowerShell 2.0 で期待どおりに動作します。そのため、 への呼び出しで何か問題が発生しているようAdd()で、その動作は 3.0 で修正されたに違いありません。

別の回避策は、最初の行を次のように変更することです...

$customObject = New-Object object

...これに...

$customObject = New-Object PSObject

...そして、PowerShell の両方のバージョンでコードがエラーなしで実行されます。次に、最初の 2 行を次のように短縮できます...

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