Dari apa yang saya tahu, PowerShell tampaknya tidak memiliki ekspresi bawaan untuk apa yang disebut operator ternary .
Misalnya, dalam bahasa C, yang mendukung operator ternary, saya bisa menulis sesuatu seperti:
<condition> ? <condition-is-true> : <condition-is-false>;
Jika itu tidak benar-benar ada di PowerShell, apa cara terbaik (yaitu mudah dibaca dan dipelihara) untuk mencapai hasil yang sama?
IIF
fungsi akan selalu mengevaluasi kedua operan. TheIf
pernyataan tidak akan - melihat stackoverflow.com/questions/1220411/... (versi VB.NET baru menambahkan ekspresi ternary:If (x, y, z)
)Jawaban:
Yang lainnya adalah kompleksitas insidental dan karenanya harus dihindari.
Untuk digunakan dalam atau sebagai ekspresi, bukan hanya tugas, bungkuslah
$()
, dengan demikian:sumber
$()
pembungkus memaksa evaluasi pernyataan sebagai ekspresi, sehingga mengembalikan nilai benar dari nilai salah, seperti operator ternary akan diharapkan. Ini adalah yang terdekat dengan PowerShell AFAIK.Konstruk PowerShell terdekat yang dapat saya tiru adalah:
sumber
({true}, {false})[!$condition]
sedikit lebih baik (mungkin): a) tatanan tradisional dari bagian yang benar dan yang salah; b)$condition
tidak harus hanya 0 atau 1 atau $ false, $ true. Operator!
mengubahnya sesuai kebutuhan. Yaitu$condition
bisa, katakanlah, 42:! 42 ~ $ false ~ 0 ~ ekspresi pertama.{true}
dan{false}
Maksudku<true expression>
dan<false expression>
, tidak blok skrip. Maaf karena tidak akurat.Powershell 7 memilikinya. https://toastit.dev/2019/09/25/ternary-operator-powershell-7/
sumber
Per posting blog PowerShell ini , Anda dapat membuat alias untuk mendefinisikan
?:
operator:Gunakan seperti ini:
sumber
?:
pernah dievaluasi maka akan membutuhkan argumen yang dievaluasi. Tanpa blok skrip itu akan memiliki penggunaan yang serupa, misalnya.(?: ($quantity -le 10) {.9} {.75})
Saya juga mencari jawaban yang lebih baik, dan sementara solusi di pos Edward adalah "ok", saya datang dengan jawaban yang jauh lebih alami. di posting blog ini
Pendek dan manis:
Yang membuatnya mudah untuk melakukan hal-hal seperti (lebih banyak contoh di posting blog):
sumber
=
sebagai alias, karena==
digunakan dalam C # dan banyak bahasa lain untuk memeriksa kesetaraan. Memiliki pengalaman dalam C # cukup umum di antara PowerShell dan yang membuat kode yang dihasilkan sedikit membingungkan.:
mungkin akan menjadi alias yang lebih baik. Menggunakannya dalam hubungannya dengan tugas variabel=:
mungkin mengingatkan seseorang tentang tugas yang digunakan dalam Pascal, tetapi tidak memiliki padanan langsung (yang saya tahu) di VB.NET atau C #.:
atau~
atau apa pun yang mengapung perahu Anda. : Dset-alias : Invoke-Assignment -Option AllScope -Description "FearTheCowboy's Invoke-Assignment."
# ternary$message =: ($age > 50) ? "Old Man" :"Young Dude"
# null$message =: $foo ?? "foo was empty"
Coba pernyataan beralih powershell sebagai alternatif, terutama untuk penugasan variabel - beberapa baris, tetapi dapat dibaca.
Contoh,
sumber
Karena operator ternary biasanya digunakan ketika menetapkan nilai, operator harus mengembalikan nilai. Inilah cara yang bisa bekerja:
Bodoh, tapi berhasil. Konstruksi ini juga dapat digunakan untuk dengan cepat mengubah int menjadi nilai lain, cukup tambahkan elemen array dan tentukan ekspresi yang mengembalikan nilai non-negatif berbasis 0.
sumber
Karena saya sudah menggunakan ini berkali-kali dan tidak melihatnya tercantum di sini, saya akan menambahkan karya saya:
$var = @{$true="this is true";$false="this is false"}[1 -eq 1]
paling jelek dari semuanya!
agak sumber
sumber
Saya baru-baru ini meningkatkan (buka PullRequest) operator bersyarat dan null ternary di PoweShell lib 'Pscx'
Pls mencari solusi saya.
Cabang topik github saya: UtilityModule_Invoke-Operators
Fungsi:
Alias
Pemakaian
Sebagai ekspresi, Anda dapat meneruskan:
$ null, literal, variabel, ekspresi 'eksternal' ($ b -eq 4) atau scriptblock {$ b -eq 4}
Jika variabel dalam ekspresi variabel adalah $ nol atau tidak ada , ekspresi alternatif dievaluasi sebagai output.
sumber
PowerShell saat ini tidak memiliki Inline If (atau ternary If ) asli tetapi Anda dapat mempertimbangkan untuk menggunakan cmdlet khusus:
Lihat: PowerShell Inline If (IIf)sumber
IIf
fungsi. Namun, tidak adaIIf
fungsi PowerShell standar / cmdlet.Berikut adalah pendekatan fungsi kustom alternatif:
Contoh
Perbedaan Dijelaskan
?
karakter sudah alias untukWhere-Object
.??
digunakan dalam bahasa lain sebagai operator penggabungan nol, dan saya ingin menghindari kebingungan.-2..2 |??? 'match' : 'nomatch'
memberi:match, match, nomatch, match, match
(yaitu karena tidak ada int nol mengevaluasitrue
; sedangkan nol mengevaluasi sampaifalse
).([bool](-2..2)) |??? 'match' : 'nomatch'
(atau hanya:[bool](-2..2) |??? 'match' : 'nomatch'
)sumber
Jika Anda hanya mencari cara sederhana dan sintaksis untuk menetapkan / mengembalikan string atau numerik berdasarkan kondisi boolean, Anda dapat menggunakan operator perkalian seperti ini:
Jika Anda hanya tertarik pada hasil ketika sesuatu itu benar, Anda bisa menghilangkan bagian yang salah sepenuhnya (atau sebaliknya), misalnya sistem penilaian sederhana:
Perhatikan bahwa nilai boolean tidak boleh menjadi istilah terkemuka dalam perkalian, yaitu $ condition * "true" dll. Tidak akan berfungsi.
sumber
Pada PowerShell versi 7, operator ternary dibangun ke dalam PowerShell.
sumber