Soweit ich weiß, scheint PowerShell keinen integrierten Ausdruck für den sogenannten ternären Operator zu haben .
In der C-Sprache, die den ternären Operator unterstützt, könnte ich beispielsweise Folgendes schreiben:
<condition> ? <condition-is-true> : <condition-is-false>;
Wenn dies in PowerShell nicht wirklich vorhanden ist, wie kann das Ergebnis am besten erzielt werden (dh einfach zu lesen und zu warten)?
IIF
Funktion wertet immer beide Operanden aus. DieIf
Anweisung wird nicht - siehe stackoverflow.com/questions/1220411/... (neuere Versionen hinzugefügt VB.NET einen ternären Ausdruck:If (x, y, z)
)Antworten:
Alles andere ist zufällige Komplexität und daher zu vermeiden.
Um es in oder als Ausdruck zu verwenden, nicht nur als Aufgabe, wickeln Sie es ein
$()
, also:quelle
$()
Wrapper die Auswertung der Anweisung als Ausdruck erzwingt und somit entweder den wahren Wert des falschen Werts zurückgibt , ähnlich wie es von einem ternären Operator erwartet wird. Dies ist die nächstgelegene Option in PowerShell AFAIK.Das nächste PowerShell-Konstrukt, das ich entwickeln konnte, um es zu emulieren, ist:
quelle
({true}, {false})[!$condition]
ist (vielleicht) etwas besser: a) traditionelle Reihenfolge von wahren und falschen Teilen; b)$condition
muss nicht nur 0 oder 1 oder $ false, $ true sein. Der Bediener!
konvertiert es nach Bedarf. Dh$condition
kann beispielsweise 42 sein :! 42 ~ $ false ~ 0 ~ erster Ausdruck.{true}
und{false}
ich meine<true expression>
und<false expression>
nicht Skriptblöcke. Entschuldigung für die Ungenauigkeit.In diesem PowerShell-Blogbeitrag können Sie einen Alias zum Definieren eines
?:
Operators erstellen :Verwenden Sie es so:
quelle
?:
jemals ausgewertet wird, müssen die Argumente ausgewertet werden. Ohne einen Skriptblock hätte es eine ähnliche Verwendung, z.(?: ($quantity -le 10) {.9} {.75})
Powershell 7 hat es. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
quelle
Auch ich suchte nach einer besseren Antwort und während die Lösung in Edwards Beitrag "ok" ist, habe ich in diesem Blog-Beitrag eine weitaus natürlichere Lösung gefunden
Kurz und bündig:
Das macht es einfach, Dinge zu tun wie (weitere Beispiele im Blog-Beitrag):
quelle
=
als Alias, weil==
es in C # und vielen anderen Sprachen zur Gleichheitsprüfung verwendet wird. Einige Erfahrungen in C # sind unter Powershellern ziemlich häufig und das macht den resultierenden Code etwas verwirrend.:
wäre möglicherweise ein besserer Alias. Die Verwendung in Verbindung mit der Variablenzuweisung erinnert=:
möglicherweise jemanden an die in Pascal verwendete Zuweisung, hat jedoch weder in VB.NET noch in C # eine unmittelbare Entsprechung (die mir bekannt ist).:
oder~
oder was auch immer Ihr Boot schwimmt. : Dset-alias : Invoke-Assignment -Option AllScope -Description "FearTheCowboy's Invoke-Assignment."
# ternary$message =: ($age > 50) ? "Old Man" :"Young Dude"
# null coalescing$message =: $foo ?? "foo was empty"
`Versuchen Sie alternativ die switch- Anweisung von Powershell , insbesondere für die Variablenzuweisung - mehrere Zeilen, aber lesbar.
Beispiel,
quelle
Da beim Zuweisen von Werten normalerweise ein ternärer Operator verwendet wird, sollte er einen Wert zurückgeben. So kann es funktionieren:
Dumm, aber arbeitend. Diese Konstruktion kann auch verwendet werden, um ein int schnell in einen anderen Wert umzuwandeln. Fügen Sie einfach Array-Elemente hinzu und geben Sie einen Ausdruck an, der 0-basierte nicht negative Werte zurückgibt.
quelle
Da ich das schon oft benutzt habe und es hier nicht aufgelistet habe, werde ich mein Stück hinzufügen:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
hässlichste von allen!
irgendwie Quelle
quelle
Ich habe kürzlich die ternären Bedingungs- und Null-Koaleszenz-Operatoren in der PoweShell-Bibliothek 'Pscx' verbessert (Open PullRequest). Bitte
suchen Sie nach meiner Lösung.
Mein Github-Themenzweig: UtilityModule_Invoke-Operators
Funktionen:
Aliase
Verwendung
Als Ausdruck können Sie
Folgendes übergeben: $ null, ein Literal, eine Variable, einen 'externen' Ausdruck ($ b -eq 4) oder einen Skriptblock {$ b -eq 4}
Wenn eine Variable im Variablenausdruck $ null ist oder nicht vorhanden ist wird der alternative Ausdruck als Ausgabe ausgewertet.
quelle
PowerShell verfügt derzeit nicht über ein natives Inline-If (oder ein ternäres If ). Sie können jedoch auch das benutzerdefinierte Cmdlet verwenden:
Siehe: PowerShell Inline If (IIf)quelle
IIf
Funktion erstellt. Es gibt jedoch keine Standard-PowerShell-IIf
Funktion / Cmdlet.Hier ist ein alternativer Ansatz für benutzerdefinierte Funktionen:
Beispiel
Unterschiede erklärt
?
Charakter ist bereits ein Alias fürWhere-Object
.??
wird in anderen Sprachen als Null-Koaleszenz-Operator verwendet, und ich wollte Verwirrung vermeiden.-2..2 |??? 'match' : 'nomatch'
gibt:match, match, nomatch, match, match
(dh da jedes Nicht-Null-Int zu ergibttrue
; während Null zu ausgewertet wirdfalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(oder einfach:[bool](-2..2) |??? 'match' : 'nomatch'
)quelle
Wenn Sie nur nach einer syntaktisch einfachen Möglichkeit suchen, eine Zeichenfolge oder eine Zahl basierend auf einer booleschen Bedingung zuzuweisen / zurückzugeben, können Sie den Multiplikationsoperator folgendermaßen verwenden:
Wenn Sie nur dann an dem Ergebnis interessiert sind, wenn etwas wahr ist, können Sie den falschen Teil einfach ganz weglassen (oder umgekehrt), z. B. ein einfaches Bewertungssystem:
Beachten Sie, dass der boolesche Wert nicht der führende Begriff in der Multiplikation sein sollte, dh $ condition * "true" usw. funktioniert nicht.
quelle
Ab PowerShell Version 7 ist der ternäre Operator in PowerShell integriert.
quelle