2012-12-03 11 views
12

C'è un modo per creare un parametro in una funzione di PowerShell in cui è necessario chiamarlo per poterlo considerare?Creare una funzione con variabili di chiamata opzionali

Un esempio dato dal commandlet (il grassetto essere ciò che voglio fare):

Invoke-Command-computernameServer01-Scriptblock{...}

Ecco un esempio di quello che voglio fare con la funzione

Function DoStuff($computername, -arg2, -domain $domain) 
    Test-parameter(-domain) if (-domain -eq $true) { 
     use $domain 
    } 
    Else { 
     $domain = "Domain1" 
    } 
    test-parameter($arg2) { 
     if ($arg2 -eq $true) { 
      Do something 
     } 
     else { 
      Do the opposite 
     } 
    } 

Quindi in sintesi:

Se "-arg2" è presente, voglio che qualcosa accada nello script. Se "-Domain" è presente e ha un argomento con esso, voglio che sia usato piuttosto che l'argomento set.

risposta

23

PowerShell fornisce un supporto integrato per scenari di parametri comuni, inclusi parametri obbligatori, parametri facoltativi, parametri "switch" (ovvero flag) e "set di parametri".

Per impostazione predefinita, tutti i parametri sono facoltativi. L'approccio più semplice è semplicemente controllarne uno per $null, quindi implementare qualsiasi logica desideri da lì. Questo è fondamentalmente ciò che hai già mostrato nel codice di esempio.

Se si desidera conoscere tutto il supporto speciale che Powershell può dare, prova anche questi link:

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

+0

Perfetto Grazie una tonnellata! – user100541

+2

Si noti che i parametri '[string]' sono inizializzati con la stringa vuota e non sono '$ null'. Devono essere testati con '-eq ''' – helb

5

Non sono sicuro di aver letto correttamente la domanda.

Da quanto raccolto, si desidera poter assegnare un valore a Dominio se è nullo e anche cosa controllare se $ args2 è fornito e in base al valore, eseguire un determinato codice?

Ho modificato il codice per riassemblare le ipotesi fatte sopra.

Function DoStuff($computername, $arg2, $domain) 
{ 
    if($domain -ne $null) 
    { 
     $domain = "Domain1" 
    } 

    if($arg2 -eq $null) 
    { 
    } 
    else 
    { 
    } 
} 

DoStuff -computername "Test" -arg2 "" -domain "Domain2" 
DoStuff -computername "Test" -arg2 "Test" -domain "" 
DoStuff -computername "Test" -domain "Domain2" 
DoStuff -computername "Test" -arg2 "Domain2" 

È stato di aiuto?

11

non credo la tua domanda è molto chiara, questo codice presuppone che se vuoi includere il parametro -domain, è sempre 'named' (cioè dostuff computername arg2 -domain domain); questo rende anche obbligatorio il parametro computername.

Function DoStuff(){ 
    param(
     [Parameter(Mandatory=$true)][string]$computername, 
     [Parameter(Mandatory=$false)][string]$arg2, 
     [Parameter(Mandatory=$false)][string]$domain 
    ) 
    if(!($domain)){ 
     $domain = 'domain1' 
    } 
    write-host $domain 
    if($arg2){ 
     write-host "arg2 present... executing script block" 
    } 
    else{ 
     write-host "arg2 missing... exiting or whatever" 
    } 
} 
0

Mi sono imbattuto in questa domanda nella mia ricerca di una risposta allo stesso problema. Ho trovato una splendida panoramica/tutorial, che voglio condividere con voi, futuri viaggiatori:

PowerShell ABC's - P is for Parameters

Problemi correlati