2012-04-11 18 views
5

में accessors मिल MSDN के अनुसार:प्रचार PowerShell cmdlet मापदंडों

"पैरामीटर सार्वजनिक गैर स्थिर क्षेत्रों या गुणों पर घोषित किया जाना चाहिए पैरामीटर गुणों पर घोषित किया जाना चाहिए संपत्ति एक सार्वजनिक सेट होना चाहिए।। एक्सेसर, और यदि ValueFromPipeline या ValueFromPipelineByPropertyName कीवर्ड निर्दिष्ट है, तो संपत्ति में सार्वजनिक रूप से एक्सेस प्राप्तकर्ता होना चाहिए। "

मुझे अपने cmdlet ValueFromPipeline पैरामीटर में एक्सेसर्स क्यों घोषित करने की घोषणा करनी है? जहां तक ​​मुझे पता है, पावरशेल को केवल अपने मूल्यों को रखने की जरूरत है, उन्हें पढ़ न दें। धन्यवाद (जिस तरह से मैं इस व्यवहार के बारे में उत्सुक हूँ :))।

+0

यह एक अजीब आवश्यकता प्रतीत होता है। मैं केवल यह मान सकता हूं कि यह एक कार्यान्वयन आर्टेफैक्ट (यानी लीकी अबास्ट्रक्शन) है: वैधता से निपटने के दौरान कोड के माध्यम से और पैरामीटर गुणों पर लागू रूपांतरणों को दिखाता है कि प्रसंस्करण सरल नहीं है। दूसरी ओर मैंने सार्वजनिक सेट के साथ स्वचालित संपत्ति के अलावा शायद ही कभी कुछ भी उपयोग किया है और किसी परिस्थिति के बारे में सोच नहीं सकता है जहां मैं कुछ और चाहता हूं। – Richard

उत्तर

3

PowerShell डिफ़ॉल्ट मान पैरामीटर ValueFromPipeline या ValueFromPipelineByPropertyName के साथ चिह्नित the pipeline से प्राप्त नई मान निर्दिष्ट से पहले एक बैकअप बनाने के लिए की पढ़ता है।

पर विचार करें निम्न cmdlets:

New-Post -Title <string> 
Set-Post -InputObject <Post> -Title <string> 

जहां निम्न लागू होगा:

  • New-Post cmdlet पाइपलाइन रिटर्न नव निर्मित Post वस्तु है, जो एक Title संपत्ति
  • है
  • InputObject संपत्ति ओ n Set-Post cmdlet ValueFromPipeline = true
  • TitleSet-Post cmdlet पर संपत्ति ValueFromPipelineByPropertyName = true के साथ चिह्नित है।

निम्न आदेश के साथ उन्हें संयोजन:

New-Post -Title "Foo" | Set-Post 

और निम्न स्टैक ट्रेस में Set-Post cmdlet के Title संपत्ति परिणामों की एक्सेसर प्राप्त पर एक ब्रेकपाइंट की स्थापना:

Stack trace for parameter binding in PowerShell

जैसा कि आप देख सकते हैं, CmdletParameterBinderController.GetDefaultParameterValue विधिबाध्यकारी प्रक्रिया के दौरान लागू की जाती है पाइपलाइन से आने वाली वस्तु पर संबंधित संपत्ति से मूल्य के साथ Set-Post सेमीडलेट परसंपत्ति।

+0

+1 कम से कम आश्चर्य के सिद्धांत का हवाला देते हुए। –

+0

-1। हालांकि इसमें कोई तर्क है, यह नहीं है कि पीएसएच कैसे काम करता है। Cmdlet के भीतर आप पाइपलाइन के अगले चरण में वस्तुओं (या संग्रह) को पास करने के लिए 'WriteObject'' कहते हैं। – Richard

+0

@ रिचर्ड मुझे लगता है कि आपने मेरे बिंदु को गलत समझा।मैं पूरे ऑब्जेक्ट को पाइपलाइन के माध्यम से पारित होने से रोकने के बारे में बात नहीं कर रहा हूं बल्कि एक ही नाम के साथ * पैरामीटर के स्वचालित असाइनमेंट के बारे में बात नहीं कर रहा हूं। PowerShell cmdlet के पैरामीटर को असाइन किए गए मान को पुनर्प्राप्त करने में सक्षम नहीं होगा यदि संबंधित गुण * केवल-लिखने * थे। –

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