2012-05-25 15 views
6

¿Hay alguna manera de tener algunos de los parámetros obligatorios basados ​​en alguna condición (por ejemplo: si uno de los parámetros es ausente o falso) en la función de PowerShell?Parámetros de powershell condicional

Mi idea es poder llamar a la función de dos maneras. Ejemplo concreto es la función que obtiene la lista del punto compartido - debería poder llamarlo con la URL relativa de la lista (un único parámetro) O con la url web y el nombre desplegable de la lista (dos parámetros, ambos obligatorios, pero solo si la lista es relativa no utilizado).

Espero que mi pregunta sea clara.

Respuesta

9

Como Christian indicó que esto se puede lograr a través de ParameterSetNames. Echar un vistazo a este ejemplo:

function Get-MySPWeb { 
    [CmdletBinding(DefaultParameterSetName="set1")] 
    param (
     [parameter(ParameterSetName="set1")] $RelativeUrl, 
     [parameter(ParameterSetName="set2")] $WebUrl, 
     [parameter(ParameterSetName="set2", Mandatory=$true)] $DisplayName 
    ) 
    Write-Host ("Parameter set in action: " + $PSCmdlet.ParameterSetName) 
    Write-Host ("RelativeUrl: " + $RelativeUrl) 
    Write-Host ("WebUrl: " + $WebUrl) 
    Write-Host ("DisplayName: " + $DisplayName) 

} 

Si lo ejecuta con -RelativeUrl Foo se unirá a "SET1". Si llama a esta función sin parámetros, también se vinculará a "set1".

(Nota -cuando no se proporcionan parámetros de PowerShell v3 (con Windows 8 Consumer Preview) se unirá a "SET1", sin embargo, será error vinculante en PowerShell v2 a menos que agregue [CmdletBinding(DefaultParameterSetName="set1")] al bloque de parámetro Gracias. @ x0n para la sugerencia DefaultParameterSetName!)

Si intenta ejecutarlo con un valor de parámetro de ambos conjuntos, obtendrá un error.

Si lo ejecuta con -WebUrl Bar le pedirá un valor de parámetro para DisplayName porque es un parámetro obligatorio.

+0

¡Esto es exactamente lo que necesitaba! ¡Gracias! Solo una cosa: cuando ejecuto esto sin params, obtengo un error (pero lo quería de esta manera). Una pregunta de seguimiento: cuando se utilizan los conjuntos de parámetros, se pretende usar el modificador con la variable $ PSCmdlet.ParameterSetName, ¿verdad? – jumbo

+0

Derecha, '$ PSCmdlet.ParameterSetName' está allí para que pueda tomar la acción adecuada en función del conjunto de parámetros evaluados por el proceso de enlace de parámetros. Por cierto, es interesante que hayas recibido un error, parece que esta es una diferencia en el comportamiento entre PSv2 y PSv3. –

+1

El truco para hacer que funcione como v3 es utilizar una directiva de conjunto de parámetros predeterminada. He editado tu respuesta para mostrar esto. – x0n

1

Necesita usar Parameters Set naming. Puede asignar un parámetro exclusivo a un nombre de conjunto de parámetros diferente.

+0

¿Puede darme un pequeño ejemplo de cómo puedo lograr lo que escribí? – jumbo

+0

Lea aquí http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx Estoy demasiado ocupado ahora para escribir un ejemplo pero el enlace da una buena explicación. –

+1

Código en los comentarios se ve mal ... pero: parámetro ( [Parámetro (ParameterSetName = 'rel', Mandatory = $ true)] [cadena] $ URLrelativa, [Parámetro (ParameterSetName = 'red', obligatoria = $ true)] [string] $ WebUrl, [Parámetro (ParameterSetName = 'web', Obligatorio = $ true)] [cadena] $ DisplayName ) Ahora debe parametrizar * sets *, uno para cada escenario. El parámetro puede ir a varios conjuntos o a todos los conjuntos (si no se especifica parameterSetName). Más en ayuda about_Functions_Advanced_Parameters – BartekB

Cuestiones relacionadas