2009-04-28 10 views
6

प्रलेखन राज्यों:ऐड-सदस्य के लिए कौन सी वस्तुएं उपयुक्त हैं?

करने के लिए एक उपयोगकर्ता-निर्धारित कस्टम सदस्य एक Windows PowerShell वस्तु का एक उदाहरण जोड़ता है।

"विंडोज पावरशेल ऑब्जेक्ट" क्या है?

यह ठीक काम करता है:

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

लेकिन यह नहीं करता है: असल में

$obj = @{} 

, मैं $ त्रुटि के संपत्ति जोड़ने की कोशिश कर रहा हूँ [0]।

उत्तर

16

पावरशेल को पीएसओब्जेक्ट कहा जाता है जो किसी भी .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 

अब, कारण:

पहला उदाहरण के लिए वापस जा रहे हैं, तो आप इसे अपेक्षित तरीके से कर सकते हैं करने के लिए इसे बदल कर हैशटेबल्स को पावरशेल द्वारा विशेष रूप से माना जाता है और मूल रूप से हैशटेबल्स के लिए एडाप्टर गुणों (किडा) के रूप में चाबियों का उपयोग करता है और एड-सदस्य इस तरह के ऑब्जेक्ट के साथ अपेक्षित काम नहीं करेगा।

+0

स्पष्टीकरण के लिए धन्यवाद! – alex2k8

संबंधित मुद्दे