पावरशेल को पीएसओब्जेक्ट कहा जाता है जो किसी भी .NET ऑब्जेक्ट (या यह पूरी तरह से कस्टम ऑब्जेक्ट हो सकता है) के आसपास एक रैपर है और जब आप एड-सदस्य कहते हैं, तो PowerShell एक पीएसओब्जेक्ट के साथ असली .NET ऑब्जेक्ट को स्पष्ट रूप से लपेट रहा है।
जिस तरह से सदस्य-सदस्य काम करता है इस पर निर्भर करता है कि आपने PSObject से शुरुआत की है या नहीं। यदि आपने पीएसओब्जेक्ट से शुरुआत नहीं की है, तो एड-सदस्य इनपुट को पीएसओब्जेक्ट में लपेट देगा और अनुकूलित ऑब्जेक्ट को देखने के लिए आपको चर को फिर से असाइन करना होगा।
उदाहरण के लिए
तो:
$x = [Environment]::OSVersion
$x | Add-Member NoteProperty IsVista $true
$x | Format-List # does not show the new property
इसका कारण यह है OSVersion लिपटे नहीं है एक PSObject है। ऐड-सदस्य इसे लपेटता है लेकिन वह रैपर खो जाता है क्योंकि आप लपेटा हुआ ऑब्जेक्ट में $ x को फिर से असाइन नहीं कर रहे हैं। इस व्यवहार के साथ तुलना करें:
$x = New-Object OperatingSystem ('Win32NT', '6.0')
$x | Add-Member NoteProperty IsVista $true
$x | Format-List # DOES show the new property
ऐसा इसलिए है क्योंकि न्यू ऑब्जेक्ट एक पीएसओब्जेक्ट में नए उदाहरण को स्पष्ट रूप से लपेटता है। तो आपका ऐड-सदस्य कॉल मौजूदा रैपर में सदस्यों को जोड़ रहा है। कि Hashtable जिस तरह से आप उम्मीद करते हैं क्योंकि है काम नहीं करता है कि सभी के बाद
$x = [Environment]::OSVersion
$x = $x | Add-Member NoteProperty IsVista $true -PassThru
$x | Format-List # DOES show the new property
अब, कारण:
पहला उदाहरण के लिए वापस जा रहे हैं, तो आप इसे अपेक्षित तरीके से कर सकते हैं करने के लिए इसे बदल कर हैशटेबल्स को पावरशेल द्वारा विशेष रूप से माना जाता है और मूल रूप से हैशटेबल्स के लिए एडाप्टर गुणों (किडा) के रूप में चाबियों का उपयोग करता है और एड-सदस्य इस तरह के ऑब्जेक्ट के साथ अपेक्षित काम नहीं करेगा।
स्पष्टीकरण के लिए धन्यवाद! – alex2k8