2012-09-14 13 views
16

que tienen esta secuencia de comandos que se puede llamar de dos maneras:¿Cómo proporcionar atributos de param para un script en Powershell?

MyScript -foo path\to\folder 

o

MyScript -bar path\to\folder 

(Es decir, que puede o bien pasar un interruptor además de una carpeta o un argumento de cadena más una carpeta.)

he tratado de poner parameter declarations en mi guión como para reflejar que la sintaxis:

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

Pero entonces tengo que pasar path explícitamente para invocar el script:

MyScript -l -path path\to\folder 

Así (cómo) que puedo hacer yo por lo tanto bar y path parámetros de posición?

Nota: Si he elegido una sintaxis extraordinariamente estúpida para invocar el script, aún puedo cambiarlo.

Respuesta

26

Un par de cosas: Es necesario utilizar parámetro establece para contar PowerShell que hay maneras mutuamente excluyentes para invocar el script; es decir, no puede usar el interruptor y la cadena al mismo tiempo. Los conjuntos también sirven para permitirle establecer la posición de $bar y $filepath en el índice 0. No es necesario que los conmutadores se coloquen en posición, ya que no son ambiguos para el encuadernador y se colocan en cualquier lugar. Además, al menos un parámetro en cada conjunto debe ser obligatorio.

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 
} 

El atributo CmdletBinding se necesita para especificar qué conjunto de parámetros debe ser el valor por defecto si la función es invocada sin parámetros.

Aquí está la ayuda de sintaxis para la configuración anterior:

PS> test-set -? 

NAME 
    test-set 

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

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

y aquí está la salida para diferentes invocaciones:

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 

Espero que esto ayude.

+0

Ok, entonces esto lo hizo, y ahora todo funciona maravillosamente. ¡Muchas gracias! – sbi

0

Como explica here puede especificar la posición del parámetro de su parámetro.

[parameter(Position=0)] 
+1

Pero esto no permitirá la segunda sintaxis de llamada. –

Cuestiones relacionadas