2012-06-21 7 views
8

ganz einfach zu sein, wie initialisieren ich den params Teil meines Powershell-Skript, so kann ich ein Kommandozeilen-Argumente haben wieeinen optionalen Parameter zu haben, das einen anderen Parameter erfordert vorhanden

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

So ist die einzige Zeit, kann ich Verwenden Sie -bar ist, wenn foo2 definiert hat.

Wenn -bar war nicht abhängig von -foo2 ich nur

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

    [string]$foo2, 

    [string]$bar 
) 

Allerdings weiß ich nicht, was den abhängigen Parameter tun zu machen.

+4

Überprüfen Sie diese Frage: http://stackoverflow.com/questions/10748978/conditional-powershell-parameters/10749238#10749238 –

Antwort

9

Meine Lesart der ursprünglichen Frage ist etwas anders zu CBs. Von

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

Das erste Argument $ foo1 ist immer obligatorisch, während bei $ bar angegeben $ foo2 auch angegeben werden muss.

Also meine Codierung von es würde $ foo1 in beiden Parametersätzen setzen.

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" 

Sie erhalten dann die folgende Ausgabe, wenn Sie das obige ausführen.

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

Sie ParameterSet benötigen, lesen Sie hier mehr darüber wissen:

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

Ihr Codebeispiel:

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