2009-04-28 9 views
6

ドキュメントの状態:Add-Memberにはどのようなオブジェクトが適していますか?

のWindows PowerShell オブジェクトのインスタンスにユーザーが定義したカスタムメンバーを追加します。

「Windows PowerShellオブジェクト」は何を表していますか?

これは正常に動作します:

$obj = new-object system.object 
$obj | add-member -membertype noteproperty -name Name -value "OK" 
$obj.name 

しかし、これはしていません:

$obj = @{} 

実は、私は$エラーにプロパティを追加しようとしています[0]。

答えて

16

PowerShellには、.NETオブジェクトのラッパー(または完全にカスタムオブジェクト)があり、Add-Memberを呼び出すと、実際の.NETオブジェクトが暗黙的にPSObjectでラップされます。

メンバーの追加方法は、PSObjectで開始したかどうかによって異なります。 PSObjectで始まらなかった場合、Add-Memberは入力をPSObjectにラップし、変更されたオブジェクトを見るために変数を再割り当てする必要があります。例えばので

:いるOSVersionがPSObjectでラップされていないため、

$x = [Environment]::OSVersion 
$x | Add-Member NoteProperty IsVista $true 
$x | Format-List # does not show the new property 

これがあります。 Add-Memberはラップしますが、ラップされたオブジェクトに$ xを再割り当てしていないため、ラッパーは失われます。

$x = New-Object OperatingSystem ('Win32NT', '6.0') 
$x | Add-Member NoteProperty IsVista $true 
$x | Format-List # DOES show the new property 

これは、新しいオブジェクトが暗黙的に新しいインスタンスをPSObjectにラップするためです。したがって、あなたのAdd-Member呼び出しは、既存のラッパーにメンバーを追加しています。ハッシュテーブルは、あなたがあるためである期待するように動作していないことを、すべてのことの後に今

$x = [Environment]::OSVersion 
$x = $x | Add-Member NoteProperty IsVista $true -PassThru 
$x | Format-List # DOES show the new property 

理由を:最初の例に戻って

、あなたはそれを変更することにより、それが期待どおりに動作することができますハッシュテーブルはPowerShellで特別扱いされ、基本的にはHashtablesのアダプタはそのキーをプロパティとして使用し、このようなオブジェクトではAdd-Memberは期待どおりに動作しません。

+0

ありがとうございます! – alex2k8

関連する問題