2012-06-21 32 views
8

En pocas palabras, ¿cómo puedo inicializar la parte params de mi script de PowerShell para que pueda tener unas argumentos de línea de comando comoTener un parámetro opcional que requiere otro parámetro para estar presente

Get-Foo [-foo1] <foo1Arg> [-foo2 <foo2Arg> [-bar <barArg>]] 

Así que la única vez que puedo use -bar cuando se haya definido foo2.

Si -bar no dependía de -foo2 tan sólo pudiera hacer

[CmdletBinding()] 
param (
    [Parameter(Mandatory=$true)] 
    [string]$foo1, 

    [string]$foo2, 

    [string]$bar 
) 

Sin embargo no sé qué hacer para que ese parámetro dependiente.

+4

Consulte esta pregunta: http://stackoverflow.com/questions/10748978/conditional-powershell-parameters/10749238#10749238 –

Respuesta

9

Mi lectura de la pregunta original es ligeramente diferente a CB's. De

Get-Foo [-foo1] <foo1Arg> [-foo2 <foo2Arg> [-bar <barArg>]] 

El primer argumento $ foo1 siempre es obligatoria, mientras que si se especifica $ bar $ foo2 debe especificarse también.

Así que mi codificación sería poner $ foo1 en ambos conjuntos de parámetros.

function Get-Foo 
{ 
[CmdletBinding(DefaultParameterSetName="set1")] 
param (
    [Parameter(ParameterSetName="set1", Mandatory=$true, Position=0)] 
    [Parameter(ParameterSetName="set2", Mandatory=$true, Position=0) ] 
    [string]$foo1, 
    [Parameter(ParameterSetName="set2", Mandatory=$true)] 
    [string]$foo2, 
    [Parameter(ParameterSetName="set2", Mandatory=$false)] 
    [string]$bar 
) 
    switch ($PSCmdlet.ParameterSetName) 
    { 
     "set1" 
     { 
      $Output= "Foo is $foo1" 
     } 
     "set2" 
     { 
      if ($bar) { $Output= "Foo is $foo1, Foo2 is $foo2. Bar is $Bar" } 
      else  { $Output= "Foo is $foo1, Foo2 is $foo2"} 
     } 
    } 
    Write-Host $Output 
} 

Get-Foo -foo1 "Hello" 
Get-Foo "Hello with no argument switch" 
Get-Foo "Hello" -foo2 "There is no bar here" 
Get-Foo "Hello" -foo2 "There" -bar "Three" 
Write-Host "This Stops for input as foo2 is not specified" 
Get-Foo -foo1 "Hello" -bar "No foo2" 

Luego obtiene la siguiente salida cuando ejecuta lo anterior.

Foo is Hello 
Foo is Hello with no argument switch 
Foo is Hello, Foo2 is There is no bar here 
Foo is Hello, Foo2 is There. Bar is Three 
This Stops for input as foo2 is not specified 

cmdlet Get-Foo at command pipeline position 1 
Supply values for the following parameters: 
foo2: Typedfoo2 
Foo is Hello, Foo2 is Typedfoo2. Bar is No foo2 
7

Es necesario ParameterSet, Lea aquí para saber más sobre él:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd878348(v=vs.85).aspx

http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx

Su ejemplo de código:

[CmdletBinding(DefaultParameterSetName="set1")] 
param (
    [Parameter(ParameterSetName="set1", Mandatory=$true)] 
    [string]$foo1, 
    [Parameter(ParameterSetName="set2", Mandatory=$true)] 
    [string]$foo2, 
    [Parameter(ParameterSetName="set2")] 
    [string]$bar 
) 
Cuestiones relacionadas