2010-10-15 16 views
22

में फ़ंक्शन ओवरलोडिंग क्या आप PowerShell में फ़ंक्शन ओवरलोड कर सकते हैं?PowerShell

मैं अपने फ़ंक्शन को स्ट्रिंग, सरणी या कुछ स्विच स्वीकार करने के लिए चाहता हूं।

जो मैं चाहता का एक उदाहरण:

  • बैकअप-UsersData singleUser
  • बैकअप-UsersData @ ('एलिस', 'बॉब', 'जो')
  • बैकअप-UsersData निर्माण सभी
+1

"पैरामीटर सेट" मूल रूप से OO विधि से अधिक भार के बराबर हैं। वे कभी-कभी poewrshell के प्रकार-जबरदस्त भारी पार्सर के कारण थोड़ा सा ट्रिकियर होते हैं। – x0n

उत्तर

25

पावरशेल कार्यों में ओवरलोड नहीं किया गया है। आखिरी परिभाषा पिछले एक ही दायरे में ओवरराइड करती है या पिछले माता-पिता के दायरे में छुपाती है। इस प्रकार, आपको एक एकल कार्य बनाना चाहिए और तर्कों द्वारा अपने कॉल मोड को अलग करने का एक तरीका प्रदान करना चाहिए।

V2 में आप एक उन्नत फ़ंक्शन का उपयोग करें, help about_Functions_Advanced_Parameters देख सकते हैं और पैरामीटर सेट अस्पष्टता को दूर करने पर कुछ मैनुअल कोडिंग से बचने कर सकते हैं:

# advanced function with 3 parameter sets 
function Backup-UsersData 
(
    [Parameter(Position=0, ParameterSetName="user")] 
    [string]$user, 
    [Parameter(Position=0, ParameterSetName="array")] 
    [object[]]$array, 
    [Parameter(Position=0, ParameterSetName="all")] 
    [switch]$all 
) 
{ 
    # use this to get the parameter set name 
    $PSCmdlet.ParameterSetName 
} 

# test 
Backup-UsersData -user 'John' 
Backup-UsersData 1, 2 
Backup-UsersData -all 

# OUTPUT: 
# user 
# array 
# all 

ध्यान दें कि यह तंत्र कभी कभी अजीब है। उदाहरण के लिए पहले परीक्षण में हमें पैरामीटर नाम -user स्पष्ट रूप से निर्दिष्ट करना होगा। अन्यथा:

Backup-UsersData : Parameter set cannot be resolved using the specified named parameters. 
At C:\TEMP\_101015_110059\try2.ps1:21 char:17 
+ Backup-UsersData <<<< 'John' 
    + CategoryInfo   : InvalidArgument: (:) [Backup-UsersData], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : AmbiguousParameterSet,Backup-UsersData 

कई मामलों मानक, उन्नत नहीं में, मिश्रित मानकों के साथ समारोह करना होगा:

function Backup-UsersData 
(
    [string]$user, 
    [object[]]$array, 
    [switch]$all 
) 
{ 
    if ($user) {'user'} 
    elseif ($array) {'array'} 
    elseif ($all) {'all'} 
    else {'may be'} 
} 

Backup-UsersData -user 'John' 
Backup-UsersData -array 1, 2 
Backup-UsersData -all 
Backup-UsersData 

लेकिन इस मामले में आप समाधान हो जाना चाहिए (या स्वीकार करते हैं और ध्यान न दें) अस्पष्टता, उदा तय करने के लिए क्या हुआ अगर, कहते हैं कि ऐसा करने के लिए:

Backup-UsersData -user 'John' -array 1, 2 -all 
5

यहाँ रोमन के जवाब का एक संस्करण मुझे लगता है कि एक छोटे से अधिक लचीला है:

function Backup 
{ 
    [CmdletBinding(DefaultParameterSetName='Users')] 
    Param (
     [parameter(mandatory=$true, ParameterSetName='Users', position=0, ValueFromPipeline=$true)][string[]]$User, 
     [parameter(mandatory=$true, ParameterSetName='AllUsers')][switch]$All 
    ) 

    Begin 
    { 
     if ($All) { $User = @('User1', 'User2', 'User3') } 
    } 

    Process 
    { 
     foreach ($u in $User) 
     { 
      echo "Backup $u" 
     } 
    } 
}