Come determinare se è stato specificato un valore del parametro Cmdlet di PowerShell?
-
05-07-2019 - |
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.
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");