2012-05-25 16 views
6

C'è un modo per alcuni parametri obbligatori in base ad alcune condizioni (ad esempio: se uno dei parametri è assente o falso) nella funzione PowerShell?Parametri powershell condizionali

La mia idea è di essere in grado di chiamare la funzione in due modi. Esempio concreto è la funzione che ottiene la lista da sharepoint - dovrei essere in grado di chiamarla con url relativo alla lista (un solo parametro) OPPURE con url web ed elenco nome visualizzato (due parametri, entrambi obbligatori, ma solo se l'url relativo alla lista è non usato).

Spero che la mia domanda sia chiara.

risposta

9

Come indicato da Christian, questo può essere eseguito tramite ParameterSetNames. Date un'occhiata a questo esempio:

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) 

} 

Se lo si esegue con -RelativeUrl Foo si legherà a "SET1". Se chiami questa funzione senza parametri, si collegherà anche a "set1".

(Nota -quando parametri sono forniti in PowerShell v3 (con Win8 Consumer Preview) si legherà a "SET1", tuttavia sarà errore vincolante in PowerShell v2 se non si aggiunge [CmdletBinding(DefaultParameterSetName="set1")] al blocco param Grazie. @ x0n per il suggerimento DefaultParameterSetName!)

Se si tenta di eseguirlo con un valore di parametro da entrambi i set, si otterrà un errore.

Se lo si esegue con -WebUrl Bar, verrà richiesto un valore di parametro per DisplayName perché è un parametro obbligatorio.

+0

Questo è esattamente ciò di cui avevo bisogno! Grazie! Solo una cosa: quando eseguo questo senza parametri, ottengo un errore (ma lo volevo in questo modo). Una domanda successiva: quando si usano i parametri, si intende utilizzare switch con la variabile $ PSCmdlet.ParameterSetName, giusto? – jumbo

+0

A destra, '$ PSCmdlet.ParameterSetName' è lì, quindi è possibile eseguire l'azione appropriata in base al set di parametri valutato dal processo di associazione dei parametri. A proposito, è interessante che tu abbia ricevuto un errore, sembra che questa sia una differenza di comportamento tra PSv2 e PSv3. –

+1

Il trucco per farlo funzionare come v3 è usare una direttiva predefinita per i parametri. Ho modificato la tua risposta per mostrarlo. – x0n

1

È necessario utilizzare Parameters Set naming. È possibile assegnare un parametro esclusivo a un nome di set di parametri diverso.

+0

Potete darmi un piccolo esempio come posso realizzare ciò che ho scritto? – jumbo

+0

Leggi qui http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx Sono troppo impegnato ora per scrivere un esempio ma il link fornisce una spiegazione davvero buona. –

+1

codice nei commenti sembra male ... ma: param ( [Parametro (ParameterSetName = 'rel', Mandatory = $ true)] [stringa] $ RelativeUrl, [Parametro (ParameterSetName = 'web', Mandatory = $ true)] [string] $ WebUrl, [Parametro (ParameterSetName = 'web', Obbligatorio = $ true)] [stringa] $ DisplayName ) Ora è necessario impostare il parametro * set *, uno per ogni scenario. Il parametro può passare a più insiemi oa tutti i set (se non viene specificato parameterSetName). Altro in aiuto about_Functions_Advanced_Parameters – BartekB