Wie kann ich feststellen, ob ein Wert Powershell-Cmdlets Parameter angegeben wurde?
-
05-07-2019 - |
Frage
In Powershell 1.0, wenn ich einen Cmdlets Parameter eines Aufzählungstyp haben, was ist die empfohlene Methode zu testen, ob der Benutzer diese Parameter auf der Cmdlets Befehlszeile angegeben? Zum Beispiel:
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?
}
Gibt es eine Möglichkeit, dies zu tun, ohne isEnabled mit einem Dummy-Wert auf Saatgut zu haben? Standardmäßig wird es gleich 0, und ich möchte nicht jeden Parameter, um Samen haben oder einen Dummy-Wert auf meine Enum hinzufügen. Ich habe möglicherweise bekam viele Cmdlets mit 100 von Parametern, gibt es doch einen besseren Weg zu sein. Dies hängt damit zusammen href="https://stackoverflow.com/questions/727912/how-can-i-know-that-powershell-function-parameter-is-omitted"> diese Frage
Lösung
In diesem Fall würde ich einen Nullable-Wrapper um den Aufzählungstyp zum Beispiel verwenden
[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }
Beachten Sie das? Modifikator auf MyEnum. Dann können Sie testen, ob es gesetzt ist wie folgt:
if (this.IsEnabled.HasValue) { ... }
Andere Tipps
Powershell beiseite, es ist nie gut Stil 0 auf diese Weise zu verwenden. Sie sollten immer 0 für den am besten geeigneten Standard verwenden. In diesem Fall sollte der am besten geeignete Standard so etwas wie „entschärft“.
Dies ist letztlich nichts mit Powershell und alles zu tun, mit guten Programmierpraktiken für .NET zu tun.
- Oisin
Als Option können Sie $PSBoundParameters
Sammlung verwenden, um, ob die Methode übergeben zu überprüfen.
Nehmen wir an, wir eine JSON-Datei wie folgt { "p1": "value1", "p2": "value2" }
haben, und wir wollen eine Funktion erstellen, die Parameter p1
und p2
und Aktualisierungswert von p1
und p2
in der Datei akzeptiert, wenn sie an die Funktion übergeben werden. Lassen Sie uns sagen können diese Werte null
werden und und diese Werte als null aufweist, ist nicht gleichbedeutend mit ihnen nicht vorbei.
Zum Beispiel Update-Values -p1 $null
sollten p1
aktualisieren, um zu null
und soll nicht p2
ändern.
Um dies zu tun, sollten wir in der Lage sein, zu erkennen, ob die Parameter an die Methode übergeben wurden oder nicht.
Beispiel - Wie erkennen, ob ein Parameter übergeben wird, für einen optionalen Parameter, die als Wert null annehmen
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"
}
}
Dann, wenn Sie die Funktion mit dem folgenden Parameter ausführen:
Update-Values -p1 $null
# Update-Values -p1 "something"
Als Ergebnis sehen Sie:
p1 passed
p2 not passed
Sie können den Blog-Eintrag lesen Sie hier: Wie zu bestimmen, ob ein Parameter eines Powershell-Cmdlets übergeben wird.
Das Einzige, was ich sehen kann, ist Ihr Enum so zu modifizieren, dass 0 Wert unbekannt oder so ähnlich genannt wird.
Das Problem ist, dass Aufzählungen sind nur ganze Zahlen im Hintergrund und ganzen Zahlen sind Werttypen. Unglückliche Folge ist, dass sie benötigen, Wert haben, und dieser Wert ist standardmäßig 0.
Ich weiß, dass dieser Thread ein wenig alt ist jetzt, aber der beste Weg, dies zu tun ist, Ihre Parameter mit der Switch Art zu erklären. Dann Benutzer müssen nicht -IsEnabled passieren, würden sie nur so etwas wie -Enabled als Parameter hinzuzufügen.
Sie testen dann die .IsPresent Eigenschaft Ihrer Parameter, um zu sehen, ob der Anrufer den Anruf an das Cmdlet -fähigen hinzugefügt.
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");