Z tego co wiem, PowerShell nie wydaje się mieć wbudowanego wyrażenia dla tak zwanego operatora trójskładnikowego .
Na przykład w języku C, który obsługuje operator potrójny, mógłbym napisać coś takiego:
<condition> ? <condition-is-true> : <condition-is-false>;
Jeśli tak naprawdę nie istnieje w PowerShell, jaki byłby najlepszy sposób (tj. Łatwy do odczytania i utrzymania), aby osiągnąć ten sam wynik?
IIF
Funkcja zawsze będzie oceniać zarówno argumenty.If
Oświadczenie nie będzie - patrz stackoverflow.com/questions/1220411/... (nowsze wersje VB.NET dodał potrójny wyrażenie:If (x, y, z)
)Odpowiedzi:
Cała reszta to przypadkowa złożoność, której należy unikać.
Do użycia w lub jako wyrażenie, a nie tylko zadanie, zawiń je
$()
, a zatem:źródło
$()
opakowanie wymusza ocenę instrukcji jako wyrażenia, zwracając w ten sposób albo prawdziwą wartość fałszywej wartości, podobnie jak oczekiwałby tego operator potrójny. To jest najbliższe AFAIK PowerShell.Najbliższa konstrukcja programu PowerShell, jaką udało mi się wymyślić, naśladująca:
źródło
({true}, {false})[!$condition]
jest nieco lepszy (być może): a) tradycyjny porządek części prawdziwych i fałszywych; b)$condition
nie musi być tylko 0 lub 1 lub $ false, $ true. Operator!
konwertuje go w razie potrzeby. Czyli$condition
może być, powiedzmy, 42: 42 ~ $ false ~ 0 ~ pierwszy wyraz.{true}
i{false}
mam na myśli,<true expression>
a<false expression>
nie bloki skryptów. Przepraszamy za niedokładność.Powershell 7 ma to. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
źródło
W tym poście na blogu PowerShell możesz utworzyć alias, aby zdefiniować
?:
operatora:Użyj tego w ten sposób:
źródło
?:
jest kiedykolwiek oceniane, będzie wymagało oceny argumentów. Bez bloku skryptu miałby podobne zastosowanie, np.(?: ($quantity -le 10) {.9} {.75})
Ja również szukałem lepszej odpowiedzi i chociaż rozwiązanie w poście Edwarda jest „ok”, w tym wpisie na blogu znalazłem znacznie bardziej naturalne rozwiązanie
Krótkie i słodkie:
Co ułatwia robienie takich rzeczy (więcej przykładów w poście na blogu):
źródło
=
jako aliasu, ponieważ==
jest używany w C # i wielu innych językach do sprawdzania równości. Posiadanie doświadczenia w C # jest dość powszechne wśród PowerShellerów, co sprawia, że powstały kod jest nieco mylący.:
byłby prawdopodobnie lepszy alias. Używanie go w połączeniu z przypisywaniem zmiennych=:
może przypominać komuś przypisanie używane w Pascalu, ale nie ma żadnego bezpośredniego odpowiednika (o którym wiem) w VB.NET ani w C #.:
lub~
cokolwiek płynie łodzią. : 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"
`Wypróbuj instrukcję switch programu PowerShell jako alternatywę, szczególnie w przypadku przypisywania zmiennych - wiele wierszy, ale czytelnych.
Przykład,
źródło
Ponieważ operator trójskładnikowy jest zwykle używany podczas przypisywania wartości, powinien zwrócić wartość. Oto sposób, w jaki może działać:
Głupie, ale działające. Tej konstrukcji można także użyć do szybkiego przekształcenia liczby int w inną wartość, wystarczy dodać elementy tablicy i określić wyrażenie zwracające wartości nieujemne oparte na 0.
źródło
Ponieważ używałem tego już wiele razy i nie widziałem go tutaj, dodam swój kawałek:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
najbrzydszy ze wszystkich!
rodzaj źródła
źródło
Niedawno ulepszyłem (otwórz PullRequest) trójskładnikowe operatory warunkowe i zerowo-koalescencyjne w PoweShell lib 'Pscx'
Pls szukają mojego rozwiązania.
Moja gałąź tematów github: UtilityModule_Invoke-Operators
Funkcje:
Skróty
Stosowanie
Jako wyrażenie możesz podać:
$ null, literał, zmienna, wyrażenie „zewnętrzne” ($ b -eq 4) lub blok skryptu {$ b -eq 4}
Jeśli zmienna w wyrażeniu zmiennej jest $ null lub nie istnieje , alternatywne wyrażenie jest oceniane jako wynik.
źródło
Program PowerShell nie ma obecnie natywnego wbudowanego If (lub trójskładnikowego If ), ale można rozważyć użycie niestandardowego polecenia cmdlet:
Zobacz: PowerShell Inline If (IIf)źródło
IIf
funkcje. Jednak nie ma standardowejIIf
funkcji / polecenia cmdlet programu PowerShell .Oto alternatywne podejście do funkcji niestandardowych:
Przykład
Różnice wyjaśnione
?
postać jest już pseudonimemWhere-Object
.??
jest używany w innych językach jako zerowy operator koalescencyjny i chciałem uniknąć zamieszania.-2..2 |??? 'match' : 'nomatch'
daje:match, match, nomatch, match, match
(tj. ponieważ dowolna niezerowa liczba int ocenia natrue
; podczas gdy zero ocenia nafalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(lub po prostu:[bool](-2..2) |??? 'match' : 'nomatch'
)źródło
Jeśli szukasz tylko prostego pod względem składniowym sposobu przypisywania / zwracania łańcucha lub wartości liczbowej na podstawie warunku logicznego, możesz użyć operatora mnożenia w następujący sposób:
Jeśli kiedykolwiek interesuje Cię wynik, gdy coś jest prawdą, możesz po prostu całkowicie pominąć fałszywą część (lub odwrotnie), np. Prosty system punktacji:
Zauważ, że wartość logiczna nie powinna być wiodącym terminem w mnożeniu, tzn. $ Warunek * „prawda” itp. Nie zadziała.
źródło
Począwszy od wersji 7 programu PowerShell, trójskładnikowy operator jest wbudowany w PowerShell.
źródło