2012-12-03 42 views
12

क्या PowerShell फ़ंक्शन में पैरामीटर बनाने का कोई तरीका है जहां इसे इसे मानने के लिए आपको कॉल करना है?वैकल्पिक कॉल चर के साथ एक फ़ंक्शन बनाएं

commandlet द्वारा दिए गए एक उदाहरण (बोल्ड किया जा रहा है कि मैं क्या करना चाहते हैं):

Invoke-Command-computernameServer01-Scriptblock{...}

यहाँ मैं समारोह के साथ क्या करना चाहते हैं का एक उदाहरण है

Function DoStuff($computername, -arg2, -domain $domain) 
    Test-parameter(-domain) if (-domain -eq $true) { 
     use $domain 
    } 
    Else { 
     $domain = "Domain1" 
    } 
    test-parameter($arg2) { 
     if ($arg2 -eq $true) { 
      Do something 
     } 
     else { 
      Do the opposite 
     } 
    } 

तो संक्षेप में:

यदि "-र्ग 2" मौजूद है, तो मुझे स्क्रिप्ट में कुछ होना है। यदि "-डोमेन" मौजूद है और इसके साथ तर्क है, तो मैं चाहता हूं कि इसे सेट तर्क के बजाय उपयोग किया जाए।

उत्तर

23

पावरहेल सामान्य पैरामीटर परिदृश्यों के लिए बहुत से अंतर्निहित समर्थन प्रदान करता है, जिसमें अनिवार्य पैरामीटर, वैकल्पिक पैरामीटर, "स्विच" (उर्फ ध्वज) पैरामीटर, और "पैरामीटर सेट" शामिल हैं।

डिफ़ॉल्ट रूप से, सभी पैरामीटर वैकल्पिक हैं। सबसे बुनियादी दृष्टिकोण यह है कि प्रत्येक को $null के लिए बस जांचें, फिर वहां से जो भी तर्क आप चाहते हैं उसे लागू करें। यह मूल रूप से आपके नमूना कोड में पहले से दिखाया गया है।

आप, विशेष समर्थन कि Powershell आप दे सकते हैं के बारे में जानने के लिए ये लिंक की जाँच करना चाहते हैं:

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

+0

परफेक्ट धन्यवाद एक टन: मैं एक शानदार सिंहावलोकन/ट्यूटोरियल है, जो मैं आपके साथ साझा करना चाहते हैं, भविष्य यात्रियों मिल गया! – user100541

+2

कृपया ध्यान दें कि 'स्ट्रिंग] 'पैरामीटर खाली स्ट्रिंग के साथ प्रारंभ किए गए हैं और' $ null' नहीं हैं। उन्हें '-एक' 'के साथ परीक्षण किया जाना चाहिए – helb

5

सुनिश्चित नहीं है कि मैं सही तरीके से प्रश्न समझता हूं।

जो मैं इकट्ठा करता हूं, उससे आप डोमेन के लिए एक मान असाइन करने में सक्षम होना चाहते हैं, यदि यह शून्य है और यह भी जांचना है कि $ args2 की आपूर्ति की जाती है और मूल्य के अनुसार, एक निश्चित कोड निष्पादित करें?

मैंने उपरोक्त धारणाओं को फिर से इकट्ठा करने के लिए कोड बदल दिया।

Function DoStuff($computername, $arg2, $domain) 
{ 
    if($domain -ne $null) 
    { 
     $domain = "Domain1" 
    } 

    if($arg2 -eq $null) 
    { 
    } 
    else 
    { 
    } 
} 

DoStuff -computername "Test" -arg2 "" -domain "Domain2" 
DoStuff -computername "Test" -arg2 "Test" -domain "" 
DoStuff -computername "Test" -domain "Domain2" 
DoStuff -computername "Test" -arg2 "Domain2" 

क्या इससे मदद मिली?

11

मुझे नहीं लगता कि आपका प्रश्न बहुत स्पष्ट है, यह कोड मानता है कि यदि आप -डोमेन पैरामीटर को शामिल करने जा रहे हैं, तो यह हमेशा 'नामित' होता है (यानी dostuff computername arg2 -domain डोमेन); यह computername पैरामीटर अनिवार्य बनाता है।

Function DoStuff(){ 
    param(
     [Parameter(Mandatory=$true)][string]$computername, 
     [Parameter(Mandatory=$false)][string]$arg2, 
     [Parameter(Mandatory=$false)][string]$domain 
    ) 
    if(!($domain)){ 
     $domain = 'domain1' 
    } 
    write-host $domain 
    if($arg2){ 
     write-host "arg2 present... executing script block" 
    } 
    else{ 
     write-host "arg2 missing... exiting or whatever" 
    } 
}