2012-09-14 22 views
16

Ho questo script che può essere definito in due modi:Come fornire gli attributi param per uno script in PowerShell?

MyScript -foo path\to\folder 

o

MyScript -bar path\to\folder 

(Cioè, io posso o passare un interruttore più una cartella o un argomento stringa più una cartella.)

ho cercato di mettere parameter declarations nel mio script come a riflettere sul fatto che la sintassi:

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

Ma poi devo passare path esplicitamente richiamare lo script:

MyScript -l -path path\to\folder 

Quindi (come) posso fare che fare entrambe le bar e path parametri posizionali?

Nota: Se ho scelto una sintassi straordinariamente stupida per invocare lo script, posso ancora cambiarlo.

risposta

26

Un paio di cose: È necessario utilizzare parametro imposta per dire PowerShell che ci sono modi si escludono a vicenda per richiamare lo script; vale a dire, non è possibile utilizzare l'interruttore e la stringa contemporaneamente. I set servono anche a consentire di impostare la posizione di entrambi $bar e $filepath per essere all'indice 0. Gli switch non devono essere posizionati in modo posizionale in quanto non sono ambigui per il raccoglitore e possono essere posizionati ovunque. Inoltre, almeno un parametro in ogni set dovrebbe essere obbligatorio.

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 
} 

L'attributo CmdletBinding è necessario specificare quale set di parametri dovrebbe essere il predefinito se la funzione viene richiamata senza parametri.

Ecco l'aiuto sintassi per la configurazione di cui sopra:

PS> test-set -? 

NAME 
    test-set 

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

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

Ed ecco l'output per varie invocazioni:

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 

Spero che questo aiuti.

+0

Ok, così è stato, e ora funziona tutto magnificamente. Molte grazie! – sbi

0

Come spiegato here è possibile specificare la posizione del parametro del parametro.

[parameter(Position=0)] 
+1

Ma questo non consentirà la seconda sintassi di chiamata. –

Problemi correlati