2013-02-04 16 views
5

Tôi không thể tìm thấy câu hỏi cụ thể này đang được giải quyết, vì vậy tôi sẽ hỏi nó ở đây: Tôi dường như không thể lấy tham số dynamc làm tham số vị trí 0. Khi tôi thử, có vẻ như tham số tĩnh đầu tiên được xác định tại vị trí 1 sẽ thúc đẩy hoặc kế thừa vị trí 0 và thông số động được xác định cho vị trí 0 sau đó được thêm vào sau tại vị trí sẵn có tiếp theo (vị trí 1):Thông số động Powershell v2.0 có thể ở vị trí 0 không?

$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"; 

Khi thực hiện, tôi có được điều này:

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

tôi cho rằng kỳ vọng của tôi là các tham số năng động sẽ là vị trí 0 và tham số tĩnh sẽ là vị trí 1. ai có thể cân nhắc ở trên này? Có thể có một tham số động được định nghĩa ở mức thấp hơn (sớm hơn) một tham số tĩnh không?

Trả lời

2

Sau khi chơi xung quanh với điều này một chút, tôi phát hiện ra rằng thêm ValueFromRemainingArguments Tham số tham số vào tham số $ InputObject dường như gần nhất với hành vi mong muốn; tuy nhiên, tôi không hoàn toàn chắc chắn tại sao.

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

Một cách tiếp cận khác làm việc cho tôi là đặt đối số PositionalBinding thuộc tính CmdletBinding thành $ False. Sau đó, nếu chỉ có các tham số động có một bộ Vị trí, thì chúng sẽ nhận được các giá trị vị trí được đặt chính xác.

Điều này tất nhiên giả định rằng bạn không muốn bất kỳ tham số tĩnh nào có vị trí.