2013-02-04 8 views
5

Non riesco a trovare questa domanda specifica che viene indirizzata, quindi lo chiederò qui: Non riesco a ottenere un parametro dynamc come parametro di posizione 0. Quando provo, sembra come se il primo parametro statico definito in posizione 1 promuoverà o ereditare la posizione 0 e il parametro dinamico definito per la posizione 0 viene poi aggiunto in seguito alla posizione successiva disponibile (posizione 1):Un parametro dinamico di Powershell v2.0 può essere nella posizione 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"; 

Quando viene eseguito, ottengo questo:

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

suppongo che la mia aspettativa era che il parametro dinamico stava per essere la posizione 0 e il parametro statici stava per essere posizione 1. qualcuno può pesare su questo? È possibile definire un parametro dinamico in una posizione inferiore a (prima di) un parametro statico?

risposta

2

Dopo aver giocato un po 'con questo, ho scoperto che aggiungere l'attributo parametro ValueFromRemainingArguments al parametro $ InputObject sembra avvicinarsi al comportamento desiderato; tuttavia, non sono del tutto sicuro del perché.

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

Un altro approccio che ha funzionato per me è quello di impostare l'argomento PositionalBinding dell'attributo CmdletBinding su $ False. Quindi se solo i parametri dinamici hanno una posizione impostata, ottengono i valori posizionali impostati correttamente.

Questo ovviamente presuppone che non si desidera che nessuno dei parametri statici abbia una posizione.