2013-02-04 59 views
5

मुझे यह विशिष्ट प्रश्न संबोधित नहीं किया जा रहा है, इसलिए मैं इसे यहां पूछूंगा: मुझे स्थिति 0 पैरामीटर होने के लिए डायनेम पैरामीटर नहीं मिल रहा है। जब मैं कोशिश, ऐसा लगता है जैसे कि पहले स्थिर पैरामीटर स्थिति 1 में परिभाषित को बढ़ावा देने या स्थिति 0 और गतिशील पैरामीटर स्थिति 0 के लिए परिभाषित किया प्राप्त कर लेंगे तो अगले उपलब्ध स्थान (स्थिति 1) में बाद में जोड़ा जाता है:क्या पावरहेल v2.0 गतिशील पैरामीटर 0 स्थिति पर हो सकता है?

$x=[string]::Empty; 

    Function foo { 
     [cmdletbinding()] 
     Param (
      [Parameter(ParameterSetName="set1", 
         Position=1, 
         ValueFromPipeline=$true)] 
       $InputObject, 
      [Parameter()] 
      [switch] 
       $RequireFilePath 
     ) 
     DynamicParam { 
      $mand = $script:x -eq $null -or ` 
       $script:x -eq [string]::Empty -or ` 
       $RequireFilePath.IsPresent; 

      $attrs = New-Object System.Management.Automation.ParameterAttribute; 
      $attrs.ParameterSetName = "set1"; 
      $attrs.Mandatory = $mand; 
      $attrs.Position = 0; 

      $attrCollection = New-Object ` 
       System.Collections.ObjectModel.Collection[System.Attribute]; 
      $attrCollection.Add($attrs); 

      $FilePath = New-Object System.Management.Automation.RuntimeDefinedParameter ` 
       "FilePath", string, $attrCollection; 

      $paramDictionary = New-Object ` 
       System.Management.Automation.RuntimeDefinedParameterDictionary; 
      $paramDictionary.Add("FilePath", $FilePath); 

      $paramDictionary; 
     } 
     Begin { 
      if ($FilePath.Value -eq $null -or $FilePath.Value -eq [string]::Empty) { 
       $FilePath.Value = $script:x; 
      } else { 
       $script:x = $FilePath.Value; 
      } 
      Write-Output ("(foo)  FilePath: {0}" -f $FilePath.Value); 
      Write-Output ("(foo) RequireFilePath: {0}" -f $RequireFilePath.IsPresent); 
      Write-Output ("(foo)  script:x: {0}" -f $script:x); 
     } 
     Process { 
      Write-Output ("(foo)  InputObject: {0}" -f $InputObject); 
     } 
     End { 
     } 
    } 

    foo "filename2.txt" "zxcv"; 

जब मार डाला, मैं इस मिल:

(foo)  FilePath: zxcv 
    (foo) RequireFilePath: False 
    (foo)  script:x: zxcv 
    (foo)  InputObject: filename2.txt 

मुझे लगता है मेरी उम्मीद है कि गतिशील पैरामीटर स्थिति 0 जा रहा था और स्थिर पैरामीटर स्थिति 1. किसी को भी इस पर वजन कर सकते हैं जा रहा था था? क्या एक गतिशील पैरामीटर को स्थिर पैरामीटर (पहले से) की तुलना में कम पद पर होने के लिए परिभाषित किया जा सकता है?

उत्तर

2

इस एक छोटा सा के साथ चारों ओर खेलने के बाद, मुझे पता चला $ InputObject पैरामीटर के लिए ValueFromRemainingArguments पैरामीटर गुण जोड़ने वांछित व्यवहार के लिए निकटतम पाने के लिए लगता है कि; हालांकि, मुझे पूरा यकीन नहीं है कि क्यों।

Param (... 
    [Parameter(ParameterSetName="set1", 
       Position=1, 
       ValueFromPipeline=$true 
       ValueFromRemainingArguments=$true)] 
     $InputObject, 
    ...) 
2

एक और दृष्टिकोण है कि मेरे लिए काम किया $ गलत पर CmdletBinding विशेषता का PositionalBinding तर्क स्थापित करने के लिए है। फिर यदि केवल गतिशील पैरामीटर में स्थिति सेट होता है, तो वे स्थितित्मक मान सही ढंग से सेट करते हैं।

यह निश्चित रूप से मानता है कि आप नहीं चाहते हैं कि किसी भी स्थिर पैरामीटर की स्थिति हो।

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

  • कोई संबंधित समस्या नहीं^_^