2011-07-29 10 views
10

अगर मैं निम्नलिखितक्या मैं पावरहेल में पैरामीटर के साथ एक स्क्रिप्ट बना सकता हूं जिसमें [उपनाम ("डीबी")] है?

[parameter(Mandatory = $true)] 
[alias("db")] 
[string]$database, 

तो परिभाषित मैं, एक त्रुटि

Parameter alias cannot be specified because an alias with the name 'db' 
was defined multiple times for the command. 

कौन सा कथन सही है मिल के बाद से पहले से ही db सार्वभौमिक -Debug पैरामीटर के लिए एक उपनाम है।
पैरामीटर का नाम बदलने के बिना इस उपनाम को परिभाषित करना संभव है?

+2

यह काम करना चाहिए। लगता है जैसे आपके पास समान उपनाम वाले दो (या अधिक) पैरामीटर हैं। – Richard

उत्तर

9

क्षमा करें, आप नहीं कर सकते। -Debug एक सामान्य पैरामीटर है, इसलिए -Debug और -db ऐसे स्विच हैं जो आपके द्वारा लिखे गए कार्यों सहित बहुत अधिक चीज़ों पर उपलब्ध हैं। जैसा कि त्रुटि आपको बताती है, यह पहले ही परिभाषित है।

निर्मित उपनाम, कि unexpectantly किसी और के लिए test-db -db जैसा कॉल का मतलब जो अक्सर -db बजाय -Debug का उपयोग करता है बदल जाता है भले ही वह अपरिभाषित चारों ओर जाना संभव थे। वे उम्मीद करते हैं कि यह डिबगिंग आउटपुट सक्षम करे, एक अलग पैरामीटर निर्दिष्ट न करें।

इस समारोह पर विचार करें:

function test-db{ 
    param(
    [parameter(mandatory=$true)] 
    [string]$database) 
    write-host 'database' $database 
    write-debug 'debugging output' 
} 

अब test-db server, test-db -db server, और test-db server -db से कॉल करने की। पहला write-debug नहीं करता है, जबकि अन्य 2 करते हैं, कोई फर्क नहीं पड़ता कि -db है। तुम भी एक अलग पैरामीटर [string]$db परिभाषित कर सकते हैं (या $db को $database नाम बदलने) क्योंकि Powershell आपको यह त्रुटि दे देंगे:, इस पर

Parameter 'db' cannot be specified because it conflicts with the parameter alias of the same name for parameter 'Debug'.

अधिक जानकारी MSDN प्रति:

In addition to using the AliasAttribute attribute, the Windows PowerShell runtime performs partial name matching, even if no aliases are specified. For example, if your cmdlet has a FileName parameter and that is the only parameter that starts with F, the user could enter Filename, Filenam, File, Fi, or F and still recognize the entry as the FileName parameter.

+1

धन्यवाद, यह समझ में आता है (हालांकि दुर्भाग्यपूर्ण है)। –

+0

सही कारण के लिए कि पावरहेल हमेशा आंशिक नाम मिलान करेगा, हम स्क्रिप्ट लिखते हैं जो लगभग हमेशा पूर्ण पैरामीटर नामों का उपयोग करते हैं। अंतर्निहित पैरामीटर का उपयोग करने के लिए भी, cmdletbinding() विशेषता देखें। http://blogs.technet.com/b/heyscriptingguy/archive/2012/07/07/weekend-scripter-cmdletbinding-attribute-simplifies-powershell-functions.aspx –

+0

वाह, यह मानने के लिए कितना गूंगा है कि -DB को उपनाम करना चाहिए -debug - क्योंकि, जो डीडी पैरामीटर _database_ का मतलब नहीं लेना चाहता? – fourpastmidnight

-2
function test-db { 
    param(
    [parameter(Mandatory = $true)] 
    [string]$database=[string]$db 
) 
    $PSBoundParameters["database"] 
} 

PS> test-db -database srv 
PS> test-db -db srv 
+1

यह क्यों काम करता है? जब तक मुझे कुछ स्पष्ट याद आती है, ऐसा लगता है कि कुछ दस्तावेज नहीं है। –

+1

यह 'test-db srv -db' भी काम करता है। यहां कुछ गड़बड़ है ... –

+1

'$ db' और' $ डेटाबेस' का प्रिंटिंग जोड़ें और आप देखेंगे कि '$ db' इस तरह से असाइन नहीं किया जाता है। यह अभी भी '-Debug' के लिए लघुरूप है, इसलिए' -db srv' और 'srv -db' में,' srv' अभी भी पहला स्थितित्मक पैरामीटर है। –

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

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