Domanda

In PowerShell 1.0, se ho un parametro cmdlet di tipo enum, qual è il metodo consigliato per verificare se l'utente ha specificato quel parametro nella riga di comando del cmdlet? Ad esempio:

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?
}

Esiste un modo per farlo senza dover eseguire il seeding di IsEnabled con un valore fittizio? Di default sarà uguale a 0 e non voglio dover seminare tutti i parametri o aggiungere un valore fittizio al mio enum. Potenzialmente ho molti cmdlet con centinaia di parametri, deve esserci un modo migliore. Questo è legato a questa domanda ma io stava cercando un modo più pulito per farlo. Grazie.

È stato utile?

Soluzione

In questo caso, utilizzerei un wrapper nullable attorno al tipo di enum ad es.

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

Nota il? modificatore su MyEnum. Quindi puoi verificare se è impostato in questo modo:

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

Altri suggerimenti

PowerShell a parte, non è mai un buon stile usare 0 in quel modo. Utilizzare sempre 0 per il valore predefinito più appropriato. In questo caso, il valore predefinito più appropriato dovrebbe essere qualcosa come " Unset. & Quot;

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

  • Oisin

Come opzione puoi usare la $ PSBoundParameters per controlla se passato al metodo.

Supponiamo di avere un file json come il seguente {" p1 " ;: " value1 " ;, " p2 " ;: " value2 " } e vogliamo creare una funzione che accetti i parametri p1 e p2 e aggiorni il valore di p1 e p2 nel file, se vengono passati alla funzione. Diciamo che quei valori possono essere null e avere quei valori come null non equivale a non passarli.

Ad esempio Update-Values ??-p1 $ null dovrebbe aggiornare p1 in null e non modificare p2 .

Per fare ciò, dovremmo essere in grado di rilevare se il parametro è stato passato al metodo o meno.

Esempio: come rilevare se viene passato un parametro, per un parametro facoltativo che può accettare null come valore?

Function Update-Values ($p1, $p2) {
    If($PSBoundParameters.ContainsKey("p1")) {
        Write-Host "p1 passed"
    }
    else {
        Write-Host "p1 not passed"
    }
    If($PSBoundParameters.ContainsKey("p2")) {
        Write-Host "p2 passed"
    }
    else {
        Write-Host "p2 not passed"
    }
}

Quindi se si esegue la funzione utilizzando il seguente parametro:

Update-Values -p1 $null
# Update-Values -p1 "something"

Di conseguenza vedrai:

p1 passed
p2 not passed

Puoi leggere il post del blog qui: Come determinare se un parametro viene passato a un Cmdlet Powershell .

L'unica cosa che posso vedere è modificare il tuo enum in modo che il valore 0 sia chiamato Unknown o qualcosa del genere.

Il problema è che gli enum sono solo numeri interi in background e numeri interi sono tipi di valore. La conseguenza sfortunata è che devono avere valore e quel valore è 0 per impostazione predefinita.

So che questo thread è un po 'vecchio ora, ma il modo migliore per farlo è dichiarare il parametro usando il tipo SwitchParameter. Quindi i tuoi utenti non devono passare -IsEnabled, semplicemente aggiungerebbero qualcosa come -Enabled come parametro.

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

bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top