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は期待どおりに動作しません。
ありがとうございます! – alex2k8