2013-02-04 9 views
5

私はこの特定の質問に対処することができませんので、ここでそれを聞いてみましょう: ダイナミクスパラメータを位置0のパラメータにすることはできません。Powershell 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"; 
:私がしようとすると、位置0と位置0のために定義された動的パラメータを促進するか、または継承する位置1で定義された最初の静的パラメータは、次の利用可能な位置(位置1)で後から追加されたかのように、それはそうです実行すると

、私はこれを取得:

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

私は私の期待は動的パラメータは位置0になる予定だったと誰もがこの上で重量を量ることができます静的パラメータが1位になる予定だったということでしたと仮定しますか?静的パラメータよりも低い(より早い)位置に動的パラメータを定義することは可能ですか?

答えて

2

これをちょっとやりかえた後、ValueFromRemainingArgumentsパラメータ属性を$ InputObjectパラメータに追加すると、目的の動作に最も近いように見えます。しかし、私はなぜそれほど確かではありません。

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

もう一つのアプローチは、CmdletBinding属性のPositionalBinding引数を$ Falseに設定することです。次に、動的パラメータだけに位置が設定されている場合は、位置の値が正しく設定されます。

もちろん、静的パラメータには位置がないことを前提としています。

関連する問題