2012-09-14 2 views
16

Ich habe dieses Skript, das auf zwei Arten aufgerufen werden kann:Wie werden Parameterattribute für ein Skript in Powershell bereitgestellt?

MyScript -foo path\to\folder 

oder

MyScript -bar path\to\folder 

(Das heißt, kann ich entweder einen Schalter übergeben und einen Ordner oder ein String-Argument und einen Ordner.)

ich habe versucht, parameter declarations in mein Skript zu setzen, da diese Syntax zu reflektieren:

param(
    [parameter(Mandatory=$false)] [switch]$foo, 
    [parameter(Mandatory=$false)] [String]$bar, 
    [parameter(Mandatory=$true)] [System.IO.FileInfo]$path 
) 

Aber dann habe ich path ausdrücklich passieren das Skript aufzurufen:

MyScript -l -path path\to\folder 

So (wie) kann ich das machen beide bar und path Positionsparameter?

Hinweis: Wenn ich eine außergewöhnlich dumme Syntax für den Aufruf des Skripts gewählt habe, kann ich es noch ändern.

Antwort

26

Ein paar Dinge: Sie müssen Parametersätze verwenden, um PowerShell mitzuteilen, dass sich gegenseitig ausschließende Möglichkeiten zum Aufrufen Ihres Skripts gibt; das heißt, Sie können den Schalter und die Zeichenfolge nicht gleichzeitig verwenden. Die Sätze dienen auch dazu, dass Sie die Position von $bar und $filepath auf Index 0 setzen können. Schalter müssen nicht positionsmäßig platziert werden, da sie nicht eindeutig zu dem Ordner sind und irgendwo platziert werden müssen. Außerdem sollte mindestens ein Parameter in jedem Satz obligatorisch sein.

function test-set { 
    [CmdletBinding(DefaultParameterSetName = "BarSet")] 
    param(
     [parameter(
      mandatory=$true, 
      parametersetname="FooSet" 
     )] 
     [switch]$Foo, 

     [parameter(
      mandatory=$true, 
      position=0, 
      parametersetname="BarSet" 
     )] 
     [string]$Bar, 

     [parameter(
      mandatory=$true, 
      position=1 
     )] 
     [io.fileinfo]$FilePath 
    ) 
@" 
    Parameterset is: {0} 
    Bar is: '{1}' 
    -Foo present: {2} 
    FilePath: {3} 
"@ -f $PSCmdlet.ParameterSetName, $bar, $foo.IsPresent, $FilePath 
} 

CmdletBinding Das Attribut ist erforderlich, welcher Parametersatz spezifizieren sollte der Standard sein, wenn die Funktion ohne Parameter aufgerufen wird.

Hier ist die Syntax-Hilfe für die obige Konfiguration:

PS> test-set -? 

NAME 
    test-set 

SYNTAX 
    test-set [-Bar] <string> [-FilePath] <FileInfo> [<CommonParameters>] 

    test-set [-FilePath] <FileInfo> -Foo [<CommonParameters>] 

Und hier ist der Ausgang für verschiedene Anrufungen:

PS> test-set barval C:\temp\foo.zip 
    Parameterset is: BarSet 
    Bar is: 'barval' 
    -Foo present: False 
    FilePath: C:\temp\foo.zip 

PS> test-set -foo c:\temp\foo.zip 
    Parameterset is: FooSet 
    Bar is: '' 
    -Foo present: True 
    FilePath: c:\temp\foo.zip 

Hoffnung, das hilft.

+0

Ok, also das ist es, und es funktioniert jetzt alles wunderbar. Danke vielmals! – sbi

0

Wie erklärt here können Sie die Parameterposition Ihres Parameters angeben.

[parameter(Position=0)] 
+1

Aber dies wird die zweite Aufrufsyntax nicht zulassen. –