2009-07-29 14 views
5

PowerShell 1.0 में, यदि मेरे पास एनम प्रकार का cmdlet पैरामीटर है, तो यह जांचने के लिए अनुशंसित विधि क्या है कि उपयोगकर्ता cmdlet कमांड लाइन पर पैरामीटर निर्दिष्ट करता है या नहीं? उदाहरण के लिए:मैं कैसे निर्धारित करूं कि PowerShell Cmdlet पैरामीटर मान निर्दिष्ट किया गया था या नहीं?

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 } 

class DoSomethingCommand : PSCmdlet 
... 
private MyEnum isEnabled; 

[Parameter(Mandatory = false)] 
public MyEnum IsEnabled 
{ 
    get { return isEnabled; } 
    set { isEnabled = value; } 
} 

protected override void ProcessRecord() 
{ 
    // How do I know if the user passed -IsEnabled <value> to the cmdlet? 
} 

क्या बीज के बिना ऐसा करने का कोई तरीका है डमी मूल्य के साथ सक्षम है? डिफ़ॉल्ट रूप से यह 0 के बराबर होगा, और मैं हर पैरामीटर को बीज नहीं करना चाहता हूं या अपने enum में एक डमी मान जोड़ना नहीं चाहता। मुझे संभावित रूप से कई cmdlets 100 पैरामीटर के साथ मिल गया है, एक बेहतर तरीका होना चाहिए। यह this question से संबंधित है लेकिन मैं इसे करने का एक क्लीनर तरीका ढूंढ रहा था। धन्यवाद।

+0

@Jack स्ट्रॉ आप है कि "संभावित मापदंडों के 100 के साथ कई cmdlets का मिला", तो आप उस कार्यक्षमता के कुछ तोड़ने को देखने के लिए चाहते हो सकता है। पावरशेल के प्रमुख लाभों में से एक खोज योग्यता है और बड़ी संख्या में पैरामीटर स्वयं खोज को और अधिक कठिन बनाते हैं। –

+0

@ स्टेवेन, माफ करना, मैं भ्रामक हो सकता हूं - यह प्रत्येक cmdlet नहीं है जिसमें 100 के पैराम हैं :), लेकिन कई cmdlets जिसके परिणामस्वरूप कई पैरामीटर हैं। आपकी टिप्पणी के लिये धन्यवाद। –

उत्तर

8

इस मामले में, मैं एक नल आवरण enum प्रकार जैसे चारों ओर का प्रयोग करेंगे

[Parameter(Mandatory = false)] 
public MyEnum? IsEnabled { get; set; } 

ध्यान दें? MyEnum पर संशोधक। तो फिर तुम यह इतना की तरह सेट है, तो परीक्षण कर सकते हैं:

if (this.IsEnabled.HasValue) { ... } 
+0

यह वही है जो मैं ढूंढ रहा था। धन्यवाद। मैंने वास्तव में स्थानीय चर बनाया, न कि संपत्ति को शून्य प्रकार, जो भी काम करता है। –

1

केवल एक चीज जिसे मैं देख सकता हूं वह आपके enum को संशोधित करना है ताकि मान 0 को अज्ञात या ऐसा कुछ नाम दिया जा सके।

समस्या यह है कि enums पृष्ठभूमि में केवल पूर्णांक हैं और पूर्णांक मान प्रकार हैं। दुर्भाग्यपूर्ण परिणाम यह है कि उन्हें मूल्य होना चाहिए और वह मान डिफ़ॉल्ट रूप से 0 है।

+0

@ जोसिप, धन्यवाद, मैं बिंदु देखता हूं। X0n पर मेरी टिप्पणी देखें। –

4

पावरशेल एक तरफ, इस तरह से 0 का उपयोग करने के लिए कभी भी अच्छी शैली नहीं है। आपको सबसे उचित डिफ़ॉल्ट के लिए हमेशा 0 का उपयोग करना चाहिए। इस मामले में, सबसे उपयुक्त डिफ़ॉल्ट "अनसेट" जैसा कुछ होना चाहिए।

आखिरकार, PowerShell और .NET के लिए अच्छी कोडिंग प्रथाओं के साथ सब कुछ करने के लिए यह कुछ भी नहीं है।

  • Oisin
+0

@ x0n: आपकी प्रतिक्रिया के लिए धन्यवाद। एनम मानों के लिए 0 का उपयोग करना या नहीं, एक तर्कसंगत बिंदु है, लेकिन किसी भी तरह से मेरे मौजूदा उत्पाद में enums के लिए कई 0 मान हैं। मुझे लगता है कि मेरा व्यापक सवाल यह है कि क्या यह पैटर्न सीएमडीलेट डेवलपर्स इस स्थिति में उपयोग करते हैं? प्रत्येक पैरामीटर के लिए एक डिफ़ॉल्ट, 'निर्दिष्ट नहीं' मान का उपयोग करें, और ProcessRecord() में ऑब्जेक्ट में पैरामीटर मान लागू करने से पहले इसके विरुद्ध परीक्षण करें? यह कई पैरामीटर प्रकारों के साथ बड़े उत्पादों के लिए थोड़ा अनावश्यक हो सकता है। –

+2

शक्तिशक्ति के v2.0 में, एक नई संपत्ति को जोड़ा गया था: यह। MyInvocation.BoundParameters जहां "यह" PSCmdlet है।यह cmdlet से बंधे पैरामीटर नामों और मानों के कुंजी/मूल्य जोड़े का हैशटेबल है। यदि आपका enum निर्दिष्ट किया गया था, तो यह इस शब्दकोश में होगा। अगर यह चूक गया, तो यह वहां नहीं होगा। मुझे स्ट्रिंग हैकिंग के अलावा कुछ भी पता नहीं है जो v1.0 – x0n

+0

x0n में ऐसा ही करेगा, धन्यवाद, मैंने 2.0 संपत्ति देखी। दुर्भाग्यवश मुझे अब 1.0 के खिलाफ कोड करने की आवश्यकता है। मुझे लगता है कि एक नालीदार रैपर का उपयोग करके कीथ का जवाब नीचे है, वही है जो मैं ढूंढ रहा हूं। –

1

मैं जानता हूँ कि इस सूत्र अब एक छोटे से पुराना है, लेकिन यह करने के लिए सबसे अच्छा तरीका है SwitchParameter प्रकार का उपयोग कर अपने पैरामीटर घोषित करने के लिए है। तब आपके उपयोगकर्ताओं को पास करने की ज़रूरत नहीं है -इन्स सक्षम, वे कुछ ऐसा ही जोड़ देंगे - पैरामीटर के रूप में सक्षम।

फिर आप कॉलर जोड़े गए हैं या नहीं, यह देखने के लिए कि आप cmdlet को कॉल करने के लिए सक्षम हैं, अपने पैरामीटर की IPPresent संपत्ति का परीक्षण करें।

+0

@ डैरेन: यह निश्चित रूप से बूल पैरा के लिए काम करता है, लेकिन मैं वैकल्पिक गैर-बूल पैरा के लिए एक समाधान की तलाश में था। नामुमकिन प्रकार अच्छी तरह से काम करता प्रतीत होता है। बेशक पीएस v2 में अब cmdlet में उपलब्ध पैराम्स का एक शब्दकोश है, इसलिए शायद यह जाने का तरीका है। धन्यवाद। –

0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled"); 
+0

ध्यान दें कि यह स्थितित्मक पैरामीटर के साथ सही ढंग से काम नहीं करता है। वे बाउंड पैरामीटर में नाम से नहीं पाए जाते हैं, लेकिन निर्दिष्ट हैं और एक मूल्य है। –

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