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

War es hilfreich?

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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top