D'après ce que je sais, PowerShell ne semble pas avoir d'expression intégrée pour ce que l'on appelle l' opérateur ternaire .
Par exemple, dans le langage C, qui prend en charge l'opérateur ternaire, je pourrais écrire quelque chose comme:
<condition> ? <condition-is-true> : <condition-is-false>;
Si cela n'existe pas vraiment dans PowerShell, quelle serait la meilleure façon (c'est-à-dire facile à lire et à entretenir) pour obtenir le même résultat?
IIF
fonction évaluera toujours les deux opérandes. LaIf
déclaration ne sera pas - voir stackoverflow.com/questions/1220411/... (nouvelles versions VB.NET ajouté une expression ternaire:If (x, y, z)
)Réponses:
Tout le reste est une complexité fortuite et donc à éviter.
Pour l'utiliser dans ou en tant qu'expression, pas seulement une affectation, enveloppez-la
$()
, ainsi:la source
$()
wrapper force l'évaluation de l'instruction en tant qu'expression, retournant ainsi soit la vraie valeur de la fausse valeur, un peu comme un opérateur ternaire serait censé le faire. C'est le plus proche que vous obtiendrez dans PowerShell AFAIK.La construction PowerShell la plus proche que j'ai pu imaginer est:
la source
({true}, {false})[!$condition]
est légèrement meilleur (peut-être): a) ordre traditionnel des parties vraies et fausses; b)$condition
ne doit pas être simplement 0 ou 1 ou $ false, $ true. L'opérateur le!
convertit selon les besoins. Cela$condition
peut être, disons, 42:! 42 ~ $ false ~ 0 ~ première expression.{true}
et{false}
je veux dire<true expression>
et<false expression>
pas des blocs de script. Désolé d'être inexact.Powershell 7 l'a. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
la source
Par ce billet de blog PowerShell , vous pouvez créer un alias pour définir un
?:
opérateur:Utilisez-le comme ceci:
la source
?:
jamais il est évalué, il faudra que les arguments soient évalués. Sans bloc de script, il aurait une utilisation similaire, par exemple.(?: ($quantity -le 10) {.9} {.75})
Moi aussi, j'ai cherché une meilleure réponse, et bien que la solution dans le post d'Edward soit "ok", j'ai trouvé une solution beaucoup plus naturelle dans ce post de blog
Court et doux:
Ce qui facilite les choses comme (plus d'exemples dans le blog):
la source
=
comme alias, car il==
est utilisé en C # et dans beaucoup d'autres langages pour la vérification de l'égalité. Avoir une certaine expérience en C # est assez courant chez les PowerShellers et cela rend le code résultant un peu déroutant.:
serait peut-être un meilleur alias. L'utiliser en conjonction avec l'affectation de variables=:
peut rappeler à quelqu'un l'affectation utilisée en Pascal, mais n'a pas d'équivalent immédiat (que je sache) en VB.NET ni en C #.:
ou~
ou tout ce qui fait flotter votre bateau. : 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"
`Essayez l' instruction switch de powershell comme alternative, en particulier pour l'affectation des variables - plusieurs lignes, mais lisible.
Exemple,
la source
Puisqu'un opérateur ternaire est généralement utilisé lors de l'attribution d'une valeur, il doit renvoyer une valeur. Voici comment cela peut fonctionner:
Stupide, mais fonctionnant. Cette construction peut également être utilisée pour transformer rapidement un int en une autre valeur, ajoutez simplement des éléments de tableau et spécifiez une expression qui renvoie des valeurs non négatives basées sur 0.
la source
Comme je l'ai déjà utilisé plusieurs fois et que je ne l'ai pas vu ici, je vais ajouter ma pièce:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
le plus laid de tous!
un peu la source
la source
J'ai récemment amélioré (ouvrez PullRequest) les opérateurs conditionnels ternaires et coalescents nuls dans les libs PoweShell 'Pscx'. Cherchez
ma solution.
Ma branche de sujet github: UtilityModule_Invoke-Operators
Les fonctions:
Alias
Usage
En tant qu'expression, vous pouvez passer:
$ null, un littéral, une variable, une expression 'externe' ($ b -eq 4) ou un scriptblock {$ b -eq 4}
Si une variable dans l'expression variable est $ null ou n'existe pas , l'expression alternative est évaluée en sortie.
la source
PowerShell ne dispose pas actuellement d'un If intégré natif (ou If ternaire ), mais vous pouvez envisager d'utiliser l'applet de commande personnalisée:
Voir: PowerShell Inline If (IIf)la source
IIf
fonction. Cependant, il n'existe pas deIIf
fonction / applet de commande PowerShell standard .Voici une autre approche de fonction personnalisée:
Exemple
Différences expliquées
?
personnage est déjà un alias pourWhere-Object
.??
est utilisé dans d'autres langues comme un opérateur de coalescence nul, et je voulais éviter toute confusion.-2..2 |??? 'match' : 'nomatch'
donne:match, match, nomatch, match, match
(c'est-à-dire que tout entier non nul est évalué àtrue
; tandis que zéro est évalué àfalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(ou tout simplement:[bool](-2..2) |??? 'match' : 'nomatch'
)la source
Si vous cherchez simplement un moyen syntaxiquement simple d'affecter / renvoyer une chaîne ou un numérique basé sur une condition booléenne, vous pouvez utiliser l'opérateur de multiplication comme ceci:
Si le résultat ne vous intéresse que lorsque quelque chose est vrai, vous pouvez simplement omettre complètement la fausse partie (ou vice versa), par exemple un simple système de notation:
Notez que la valeur booléenne ne doit pas être le terme principal dans la multiplication, c'est-à-dire que $ condition * "true" etc. ne fonctionnera pas.
la source
À partir de PowerShell version 7, l'opérateur ternaire est intégré à PowerShell.
la source