स्पष्ट पैरामीटर के साथ पॉवर्सशेल पैरामीटर सेट रिज़ॉल्यूशन विफल रहता है


4

मान लें कि मेरे पास यह फ़ंक्शन है:

function Foo{
    [CmdLetBinding()]
    param(
        [Parameter(Mandatory=$true,ParameterSetName="A",Position=0)] 
        [Parameter(Mandatory=$true,ParameterSetName="both",Position=0)] 
        [int]
        $A,

        [Parameter(Mandatory=$true,ParameterSetName="B",Position=0)] 
        [Parameter(Mandatory=$true,ParameterSetName="both",Position=1)] 
        [int]
        $B
    )

    Write-Host $PsCmdlet.ParameterSetName

}

मुझे उम्मीद है कि यह विधि ए, या बी या दोनों की अपेक्षा करेगी। कभी कोई नहीं।

हालाँकि, अगर मैं इसे कॉल करता हूं:

Foo -A 1 -B 2 # outputs "both" as expected
Foo -B 3 # error
Foo -A 4 # error

मुझे जो त्रुटि मिलती है वह है:

Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto:75 char:4
+ Foo <<<<  -B 3
    + CategoryInfo          : InvalidArgument: (:) [Foo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Foo

Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto.ps1:76 char:4
+ Foo <<<<  -A 4
    + CategoryInfo          : InvalidArgument: (:) [Foo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Foo

मैं परेशान था, क्योंकि जैसा कि आप देख सकते हैं, मैं स्पष्ट रूप से मापदंडों का नाम निर्दिष्ट करता हूं।

मुझे अपेक्षा के अनुसार काम करने के लिए अपना फ़ंक्शन कैसे लिखना चाहिए?


1
दूसरों के लिए ध्यान दें : गतिशील मापदंडों के लिए सभी पैरामीटर सेटों में एक पैरामीटर का उपयोग करने के लिए एक जादुई स्ट्रिंग प्रतीत होती है -ParameterSetName="__AllParameterSets"
14

जवाबों:


6

आप शायद अपने फ़ंक्शन में पैरामीटर जाँच लागू करना चाहते हैं। MS का कहना है कि पैरामीटर सेट में एक पैरामीटर होना चाहिए जो इसके पैरामीटर सेट के लिए अद्वितीय हो। इसलिए, प्रत्येक पैरामीटर सेट में एक पैरामीटर होना चाहिए जो किसी अन्य पैरामीटर सेट से संबंधित नहीं है, जो फ़ंक्शन w / केवल एक पैरामीटर को कॉल करने का प्रयास करते समय आपकी त्रुटि का कारण है, यह नहीं जानता कि कौन सा पैरामीटर b / असाइन करने के लिए सेट है c दिया गया पैरामीटर किसी विशेष पैरामीटर सेट के लिए अद्वितीय नहीं है। मैं पास आ गया

 function Foof{
[CmdLetBinding(DefaultParameterSetName="None")]
param(

    [Parameter(Mandatory=$false,ParameterSetName="A")]
    [Parameter(Position=0)]
    [int]
    $A,

    [Parameter(Mandatory=$false,ParameterSetName="B")]
    [Parameter(Mandatory=$false,ParameterSetName="both")]  
    [Parameter(Position=1)]
    [int]
    $B,

    [Parameter(Mandatory=$false,ParameterSetName="both")]  
    [int]
    $C=$true

)

Write-Host $PsCmdlet.ParameterSetName
write-host "A=$A and B=$B and C=$C"

}

मैंने सोचा था कि $Cएक डिफ़ॉल्ट मान असाइन करने से आपका अपेक्षित व्यवहार हो जाएगा, लेकिन यह फ़ंक्शन को कॉल करते समय पैरामीटर को स्पष्ट रूप से घोषित नहीं करता है।

आप देखेंगे कि मैं DefaultParameterSetName को "कोई नहीं" पर सेट करता हूं। यह क्या करता है आप एक तेजी से इस मामले के लिए जाँच करने के लिए था अगर न तो पैरामीटर प्रस्तुत किए गए थे।

आप चेक अगर की तरह कुछ कर सकता है $PsCmdlet.ParameterSetName -eq "None"तो Read-Hostजो कुछ भी चर आप आपूर्ति चाहते हैं, या सिर्फ उत्पादन एक त्रुटि है कि या तो चर कहते हैं aया bआपूर्ति की जानी चाहिए।

http://technet.microsoft.com/en-us/library/hh847743.aspx


मैं पैरामीटर सेट सुविधा को हटाकर समाप्त हो गया। अपने कार्य में, मैं अब आपके द्वारा सुझाए गए पैरामीटर चेक द्वारा शुरू करता हूं:if((-Not $A) -and (-not $b)) { throw "Did you read the documentation? No? Shame on you!*" }
स्टीव बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.