2009-07-29 16 views
5

In PowerShell 1.0, se si dispone di un parametro cmdlet di un tipo enum, qual è il metodo consigliato per verificare se l'utente ha specificato quel parametro sulla riga di comando del cmdlet? Ad esempio:Come determinare se è stato specificato un valore del parametro Cmdlet di PowerShell?

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 } 

class DoSomethingCommand : PSCmdlet 
... 
private MyEnum isEnabled; 

[Parameter(Mandatory = false)] 
public MyEnum IsEnabled 
{ 
    get { return isEnabled; } 
    set { isEnabled = value; } 
} 

protected override void ProcessRecord() 
{ 
    // How do I know if the user passed -IsEnabled <value> to the cmdlet? 
} 

C'è un modo per farlo senza dover seminare isEnabled con un valore fittizio? Di default sarà uguale a 0, e non voglio dover seminare ogni parametro o aggiungere un valore fittizio al mio enum. Ho potenzialmente ottenuto molti cmdlet con 100 di parametri, ci deve essere un modo migliore. Questo è legato a this question ma stavo cercando un modo più pulito per farlo. Grazie.

+0

@Jack paglia Se avete "potenzialmente avuto molti cmdlet con 100 di parametri", si potrebbe desiderare di guardare rompere alcune delle funzionalità che in su. Uno dei principali vantaggi di PowerShell è la rilevabilità e la presenza di un gran numero di parametri rende la scoperta di sé molto più difficile. –

+0

@Steven, mi dispiace che possa essere stato fuorviante - non è ogni cmdlet che ha 100 di parametri :), ma molti cmdlet che risultano in molti parametri. Grazie per il tuo commento. –

risposta

8

In questo caso, sarebbe utilizzare un involucro nullable intorno al tipo enum esempio

[Parameter(Mandatory = false)] 
public MyEnum? IsEnabled { get; set; } 

Nota il? modificatore su MyEnum. Poi si può verificare se è impostato in questo modo:

if (this.IsEnabled.HasValue) { ... } 
+0

Questo è esattamente quello che stavo cercando. Grazie. In realtà ho reso la variabile locale, non la proprietà il tipo nullable, che funziona anche. –

1

L'unica cosa che posso vedere è modificare l'enum in modo che il valore 0 sia denominato Sconosciuto o qualcosa del genere.

Il problema è che le enumerazioni sono solo numeri interi in background e numeri interi sono valori. La sfortunata conseguenza è che devono avere un valore e che il valore è 0 per impostazione predefinita.

+0

@Josip, grazie, vedo il punto. Vedi il mio commento su x0n. –

4

PowerShell a parte, non è mai bello usare lo 0 in questo modo. Dovresti sempre usare 0 per il valore predefinito più appropriato. In questo caso, il valore predefinito più appropriato dovrebbe essere qualcosa come "Unset".

In definitiva, questo non ha nulla a che fare con PowerShell e tutto ciò che riguarda le buone pratiche di codifica per .NET.

  • Oisin
+0

@ x0n: Grazie per la risposta. Se usare 0 o meno per i valori enum è un punto discutibile, ma in entrambi i casi il mio prodotto esistente ha molti valori 0 per enumerazioni. Immagino che la mia domanda più ampia sia, è questo che gli sviluppatori di cmdlet di pattern usano in questa situazione? Utilizzare un valore predefinito, 'non specificato' per ogni parametro e testarlo prima di applicare i valori dei parametri all'oggetto in ProcessRecord()? Questo potrebbe diventare un po 'ingombrante per prodotti di grandi dimensioni con molti tipi di parametri. –

+2

Nella v2.0 di PowerShell, è stata aggiunta una nuova proprietà: this.MyInvocation.BoundParameters dove "this" è PSCmdlet.Questa è una tabella hash delle coppie chiave/valore dei nomi e dei valori dei parametri che erano associati al cmdlet. Se il tuo enum è stato specificato, sarà in questo dizionario. Se è impostato di default, non sarà lì. Non sono a conoscenza di qualcosa di diverso dallo string hacking che farà lo stesso nella v1.0 – x0n

+0

x0n, grazie, ho visto la proprietà 2.0. Sfortunatamente ho bisogno di codificare contro 1,0 per ora. Penso che la risposta di Keith qui sotto, usando un wrapper nullable, sia esattamente quello che sto cercando. –

1

So che questa discussione è un po 'vecchio, ma il modo migliore per farlo è quello di dichiarare il vostro parametro utilizzando il tipo SwitchParameter. Quindi i tuoi utenti non devono passare -IsEnabled, aggiungono semplicemente qualcosa come -Enabled come parametro.

Quindi testare la proprietà .IsPresent del parametro per vedere se il chiamante ha aggiunto -Enabled alla chiamata al cmdlet.

+0

@Darren: che sicuramente funziona con i parametri bool, ma stavo cercando una soluzione per i parametri facoltativi non bool. Il tipo nullable sembra funzionare bene. Naturalmente PS v2 ora ha un dizionario di parametri disponibile nel cmdlet, quindi questa è probabilmente la strada da percorrere. Grazie. –

0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled"); 
+0

Si noti che questo non funziona correttamente con i parametri posizionali. Non vengono trovati per Nome in BoundParameters, ma sono specificati e hanno un valore. –

Problemi correlati