पावरशेल कार्यों में ओवरलोड नहीं किया गया है। आखिरी परिभाषा पिछले एक ही दायरे में ओवरराइड करती है या पिछले माता-पिता के दायरे में छुपाती है। इस प्रकार, आपको एक एकल कार्य बनाना चाहिए और तर्कों द्वारा अपने कॉल मोड को अलग करने का एक तरीका प्रदान करना चाहिए।
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
"पैरामीटर सेट" मूल रूप से OO विधि से अधिक भार के बराबर हैं। वे कभी-कभी poewrshell के प्रकार-जबरदस्त भारी पार्सर के कारण थोड़ा सा ट्रिकियर होते हैं। – x0n