Из того, что я знаю, PowerShell, похоже, не имеет встроенного выражения для так называемого троичного оператора .
Например, на языке C, который поддерживает троичный оператор, я мог бы написать что-то вроде:
<condition> ? <condition-is-true> : <condition-is-false>;
Если этого не существует в PowerShell, каков наилучший способ (т.е. легко читаемый и поддерживаемый) для достижения того же результата?
IIF
Функция всегда будет оценивать оба операнда.If
Заявление не будет - см stackoverflow.com/questions/1220411/... (новые версии VB.NET добавили трехкомпонентное выражение:If (x, y, z)
)Ответы:
Все остальное имеет второстепенную сложность и поэтому его следует избегать.
Для использования в или в качестве выражения, а не просто присваивания, оберните его
$()
, таким образом:источник
$()
обертка заставляет вычислять оператор как выражение, таким образом возвращая либо истинное значение ложного значения, во многом как ожидалось бы от троичного оператора. Это самое близкое, что вы получите в PowerShell AFAIK.Самая близкая конструкция PowerShell, которую я смог придумать для эмуляции:
источник
({true}, {false})[!$condition]
немного лучше (возможно): а) традиционный порядок истинных и ложных частей; б)$condition
не обязательно должен быть просто 0 или 1 или $ false, $ true. Оператор!
преобразует его по мере необходимости. Т.е.$condition
может быть, скажем, 42:! 42 ~ $ false ~ 0 ~ первое выражение.{true}
и{false}
я имею в виду<true expression>
и<false expression>
, не скриптовые блоки. Извините, что не точный.У Powershell 7 есть это. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
источник
В этом сообщении блога PowerShell вы можете создать псевдоним для определения
?:
оператора:Используйте это так:
источник
?:
когда-либо оценивается, это потребует оценки аргументов. Без блока скрипта он будет иметь аналогичное использование, например.(?: ($quantity -le 10) {.9} {.75})
Я тоже искал лучший ответ, и хотя решение в сообщении Эдварда "хорошо", в этом сообщении в блоге я нашел гораздо более естественное решение
Коротко и сладко:
Что позволяет легко делать такие вещи, как (больше примеров в блоге):
источник
=
в качестве псевдонима, потому что==
используется в C # и многих других языках для проверки на равенство. Наличие некоторого опыта в C # довольно распространено среди powershellers, и это делает полученный код немного запутанным.:
возможно, будет лучшим псевдонимом. Использование его в сочетании с присваиванием переменной=:
может напомнить кому-то об присваивании, используемом в Pascal, но не имеет какого-либо непосредственного эквивалента (который я знаю) ни в VB.NET, ни в C #.:
или~
что-то еще плавает на вашей лодке. : 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"
`Попробуйте в качестве альтернативы оператор переключателя powershell , особенно для назначения переменных - несколько строк, но читаемые.
Пример,
источник
Поскольку при назначении значения обычно используется троичный оператор, он должен возвращать значение. Это способ, которым может работать:
Глупо, но работает. Также эту конструкцию можно использовать для быстрого превращения типа int в другое значение, просто добавьте элементы массива и укажите выражение, которое возвращает неотрицательные значения на основе 0.
источник
Поскольку я уже использовал это много раз и не увидел его здесь, я добавлю свою часть:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
самый уродливый из всех!
своего рода источник
источник
Недавно я улучшил (откройте PullRequest) троичные условные операторы и операторы с нулевым слиянием в библиотеке Psx PoweShell для
Pls, ищите мое решение.
Моя ветка github: UtilityModule_Invoke-Operators
Функции:
Псевдонимы
использование
В качестве выражения вы можете передать:
$ null, литерал, переменную, «внешнее» выражение ($ b -eq 4) или блок сценария {$ b -eq 4}
Если переменная в выражении переменной равна $ null или не существует , альтернативное выражение оценивается как вывод.
источник
В настоящее время PowerShell не имеет встроенного встроенного If (или троичного If ), но вы можете использовать собственный командлет:
См .: PowerShell Inline If (IIf)источник
IIf
функцию. Однако нет стандартнойIIf
функции / командлета PowerShell .Вот альтернативный подход к пользовательской функции:
пример
Различия объяснены
?
персонажа уже есть псевдонимWhere-Object
.??
используется в других языках как оператор объединения нулей, и я хотел избежать путаницы.-2..2 |??? 'match' : 'nomatch'
дает:match, match, nomatch, match, match
(т. е. поскольку любое ненулевое int оценивается какtrue
; в то время как нулевое оценивается какfalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(или просто:[bool](-2..2) |??? 'match' : 'nomatch'
)источник
Если вы просто ищете синтаксически простой способ присвоения / возврата строки или числа на основе логического условия, вы можете использовать оператор умножения следующим образом:
Если вас когда-нибудь интересует результат, когда что-то верно, вы можете просто полностью пропустить ложную часть (или наоборот), например, простую систему подсчета очков:
Обратите внимание, что логическое значение не должно быть ведущим в умножении, т. Е. $ Condition * "true" и т. Д. Не будет работать.
источник
Начиная с версии 7 PowerShell, троичный оператор встроен в PowerShell.
источник