Pelo que sei, o PowerShell não parece ter uma expressão interna para o chamado operador ternário .
Por exemplo, na linguagem C, que suporta o operador ternário, eu poderia escrever algo como:
<condition> ? <condition-is-true> : <condition-is-false>;
Se isso realmente não existir no PowerShell, qual seria a melhor maneira (isto é, fácil de ler e manter) para obter o mesmo resultado?
IIF
função sempre avaliará os dois operandos. AIf
declaração não irá - veja stackoverflow.com/questions/1220411/... (versões mais recentes VB.NET acrescentou uma expressão ternária:If (x, y, z)
)Respostas:
Tudo o resto é complexidade incidental e, portanto, deve ser evitado.
Para uso em ou como expressão, não apenas em uma atribuição, envolva-a
$()
assim:fonte
$()
wrapper força a avaliação da instrução como uma expressão, retornando, assim, o valor verdadeiro do valor falso, como seria esperado de um operador ternário. É o mais próximo que você chegará do PowerShell AFAIK.A construção mais próxima do PowerShell que pude criar para emular isso é:
fonte
({true}, {false})[!$condition]
é um pouco melhor (talvez): a) ordem tradicional de partes verdadeiras e falsas; b)$condition
não precisa ser apenas 0 ou 1 ou $ false, $ true. O operador!
converte-o conforme necessário. Ou seja,$condition
pode ser, digamos, 42:! 42 ~ $ false ~ 0 ~ primeira expressão.{true}
e{false}
quero dizer<true expression>
e<false expression>
, não blocos de script. Desculpe por não ser preciso.De acordo com esta postagem do blog do PowerShell , você pode criar um alias para definir um
?:
operador:Use-o assim:
fonte
?:
alguma vez for avaliado, será necessário que os argumentos sejam avaliados. Sem um bloco de script, ele teria um uso semelhante, por exemplo.(?: ($quantity -le 10) {.9} {.75})
O PowerShell 7 possui. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
fonte
Eu também procurei uma resposta melhor e, enquanto a solução na postagem de Edward é "ok", eu vim com uma solução muito mais natural nesta postagem do blog
Curto e grosso:
O que facilita fazer coisas como (mais exemplos na postagem do blog):
fonte
=
como alias, porque==
é usado em C # e em muitos outros idiomas para verificação de igualdade. Ter alguma experiência em C # é bastante comum entre os powerhellers e isso torna o código resultante um pouco confuso.:
possivelmente seria um apelido melhor. Usá-lo em conjunto com a atribuição de variável=:
pode lembrar alguém da atribuição usada no Pascal, mas não possui nenhum equivalente imediato (que eu saiba) no VB.NET nem no C #.:
ou~
ou o que quer que flutue no seu barco. : Dset-alias : Invoke-Assignment -Option AllScope -Description "FearTheCowboy's Invoke-Assignment."
# ternário$message =: ($age > 50) ? "Old Man" :"Young Dude"
# nulo coalescentes$message =: $foo ?? "foo was empty"
`Tente a instrução switch do powershell como uma alternativa, especialmente para atribuição de variáveis - várias linhas, mas legível.
Exemplo,
fonte
Como um operador ternário é geralmente usado ao atribuir valor, ele deve retornar um valor. É assim que pode funcionar:
Estúpido, mas trabalhando. Além disso, essa construção pode ser usada para transformar rapidamente um int em outro valor, basta adicionar elementos da matriz e especificar uma expressão que retorne valores não negativos baseados em 0.
fonte
Como já usei isso muitas vezes e não o vi listado aqui, adicionarei minha peça:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
mais feio de todos!
tipo de fonte
fonte
Recentemente, aprimorei (abra PullRequest) os operadores ternários condicionais e coalescentes nulos no lib 'Pscx'
Pls da PoweShell e procure minha solução.
Ramo de tópico do meu github: UtilityModule_Invoke-Operators
Funções:
Apelido
Uso
Como expressão, você pode transmitir:
$ null, uma literal, uma variável, uma expressão 'externa' ($ b -eq 4) ou um scriptblock {$ b -eq 4}
Se uma variável na expressão da variável for $ null ou não existir , a expressão alternativa é avaliada como saída.
fonte
O PowerShell atualmente não possui um Inline If nativo (ou If ternário ), mas você pode considerar usar o cmdlet personalizado:
Consulte: PowerShell Inline If (IIf)fonte
IIf
função. No entanto, não háIIf
função / cmdlet padrão do PowerShell .Aqui está uma abordagem alternativa de função personalizada:
Exemplo
Diferenças explicadas
?
personagem já é um apelido paraWhere-Object
.??
é usado em outros idiomas como um operador coalescente nulo, e eu queria evitar confusão.-2..2 |??? 'match' : 'nomatch'
: dá:match, match, nomatch, match, match
(ou seja, como qualquer int diferente de zero é avaliado comotrue
; enquanto zero é avaliado comofalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(ou simplesmente[bool](-2..2) |??? 'match' : 'nomatch'
:)fonte
Se você está apenas procurando uma maneira sintaticamente simples de atribuir / retornar uma string ou numérico com base em uma condição booleana, você pode usar o operador de multiplicação como este:
Se você só está interessado no resultado quando algo é verdadeiro, pode simplesmente omitir completamente a parte falsa (ou vice-versa), por exemplo, um sistema de pontuação simples:
Observe que o valor booleano não deve ser o termo inicial na multiplicação, ou seja, $ condition * "true" etc. não funcionará.
fonte
A partir do PowerShell versão 7, o operador ternário é incorporado ao PowerShell.
fonte