Por lo que sé, PowerShell no parece tener una expresión integrada para el llamado operador ternario .
Por ejemplo, en el lenguaje C, que admite el operador ternario, podría escribir algo como:
<condition> ? <condition-is-true> : <condition-is-false>;
Si eso realmente no existe en PowerShell, ¿cuál sería la mejor manera (es decir, fácil de leer y mantener) para lograr el mismo resultado?
IIF
función siempre evaluará ambos operandos. LaIf
declaración no será - ver stackoverflow.com/questions/1220411/... (las versiones más recientes de VB.NET añaden una expresión ternaria:If (x, y, z)
)Respuestas:
Todo lo demás es complejidad incidental y, por lo tanto, debe evitarse.
Para usar en o como una expresión, no solo una asignación, envuélvala
$()
, así:fuente
$()
contenedor fuerza la evaluación de la declaración como una expresión, devolviendo así el valor verdadero del valor falso, al igual que se esperaría de un operador ternario. Esto es lo más cerca que estará en PowerShell AFAIK.La construcción de PowerShell más cercana que he podido inventar para emular es:
fuente
({true}, {false})[!$condition]
es ligeramente mejor (quizás): a) orden tradicional de partes verdaderas y falsas; b)$condition
no tiene que ser solo 0 o 1 o $ false, $ true. El operador lo!
convierte según sea necesario. Es decir$condition
, por ejemplo, 42:! 42 ~ $ false ~ 0 ~ primera expresión.{true}
y{false}
quiero decir<true expression>
y<false expression>
, no bloques de guiones. Perdón por no ser exacto.Powershell 7 lo tiene. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
fuente
Según esta publicación de blog de PowerShell , puede crear un alias para definir un
?:
operador:Úselo así:
fuente
?:
alguna vez se evalúa requerirá que se evalúen los argumentos. Sin un bloque de script tendría un uso similar, por ejemplo.(?: ($quantity -le 10) {.9} {.75})
Yo también busqué una mejor respuesta, y aunque la solución en la publicación de Edward es "ok", encontré una solución mucho más natural en esta publicación de blog.
Corto y dulce:
Lo que facilita hacer cosas como (más ejemplos en la publicación del blog):
fuente
=
como alias, porque==
se usa en C # y en muchos otros lenguajes para verificar la igualdad. Tener cierta experiencia en C # es bastante común entre los powerhellers y eso hace que el código resultante sea un poco confuso.:
posiblemente sería un mejor alias. Usarlo en conjunción con la asignación de variables=:
podría recordarle a alguien la asignación utilizada en Pascal, pero no tiene ningún equivalente inmediato (que yo sepa) en VB.NET ni C #.:
o~
o lo que sea que flota tu bote. : 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"
`Pruebe la instrucción switch de powershell como alternativa, especialmente para la asignación de variables: varias líneas, pero legible.
Ejemplo,
fuente
Dado que generalmente se usa un operador ternario al asignar un valor, debe devolver un valor. Esta es la forma en que puede funcionar:
Estúpido, pero trabajando. Además, esta construcción se puede utilizar para convertir rápidamente un int en otro valor, simplemente agregue elementos de matriz y especifique una expresión que devuelva valores no negativos basados en 0.
fuente
Como ya lo he usado muchas veces y no lo vi listado aquí, agregaré mi pieza:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
más feo de todos!
un poco fuente
fuente
Recientemente he mejorado (abrir PullRequest) los operadores ternarios condicionales y de fusión nula en PoweShell lib 'Pscx'
Pls eche un vistazo a mi solución.
Mi rama de tema de github : UtilityModule_Invoke-Operators
Funciones:
Alias
Uso
Como expresión puede pasar:
$ null, un literal, una variable, una expresión 'externa' ($ b -eq 4) o un bloque de script {$ b -eq 4}
Si una variable en la expresión variable es $ null o no existe , la expresión alternativa se evalúa como salida.
fuente
PowerShell actualmente no tiene un If Inline nativo (o If ternario ) pero podría considerar usar el cmdlet personalizado:
Consulte: PowerShell en línea si (IIf)fuente
IIf
función. Sin embargo, no existe unaIIf
función / cmdlet estándar de PowerShell .Aquí hay un enfoque alternativo de función personalizada:
Ejemplo
Diferencias explicadas
?
personaje ya es un alias paraWhere-Object
.??
se usa en otros idiomas como operador de fusión nula, y quería evitar confusiones.-2..2 |??? 'match' : 'nomatch'
da:match, match, nomatch, match, match
(es decir, dado que cualquier int que no sea cero se evalúa comotrue
; mientras que cero se evalúa comofalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(o simplemente:[bool](-2..2) |??? 'match' : 'nomatch'
)fuente
Si solo está buscando una forma sintácticamente simple de asignar / devolver una cadena o un valor numérico basado en una condición booleana, puede usar el operador de multiplicación de esta manera:
Si solo le interesa el resultado cuando algo es cierto, puede omitir la parte falsa por completo (o viceversa), por ejemplo, un sistema de puntuación simple:
Tenga en cuenta que el valor booleano no debe ser el término principal en la multiplicación, es decir, $ condition * "true", etc. no funcionará.
fuente
A partir de PowerShell versión 7, el operador ternario está integrado en PowerShell.
fuente