about_Switch
Deskripsi singkat
Menjelaskan cara menggunakan sakelar untuk menangani beberapa if
pernyataan.
Deskripsi panjang
Untuk memeriksa kondisi dalam skrip atau fungsi, gunakan if
pernyataan. Pernyataan ini if
dapat memeriksa banyak jenis kondisi, termasuk nilai variabel dan properti objek.
Untuk memeriksa beberapa kondisi, gunakan switch
pernyataan. Pernyataan switch
ini setara dengan serangkaian if
pernyataan, tetapi lebih sederhana. Pernyataan mencantumkan switch
setiap kondisi dan tindakan opsional. Jika kondisi diperoleh, tindakan dilakukan.
Pernyataan dapat switch
menggunakan $_
variabel dan $switch
otomatis. Untuk informasi selengkapnya, lihat about_Automatic_Variables.
Sintaks
Pernyataan dasar switch
memiliki format berikut:
Switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
Pernyataan yang setara if
adalah:
if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}
<test-expression>
adalah ekspresi tunggal yang dievaluasi dalam mode ekspresi untuk mengembalikan nilai.
<result-to-be-matched>
adalah ekspresi yang nilainya dibandingkan dengan nilai input. Ekspresi mencakup nilai harfiah (string atau angka), variabel, dan blok skrip yang mengembalikan nilai boolean.
Setiap nilai yang tidak dikutip yang tidak dikenali sebagai angka diperlakukan sebagai string.
Untuk menghindari kebingungan atau konversi string yang tidak diinginkan, Anda harus selalu mengutip nilai string. Sertakan ekspresi apa pun dalam tanda kurung ()
, membuat subekspresi, untuk memastikan bahwa ekspresi dievaluasi dengan benar.
Penting untuk dipahami bahwa <result-to-be-matched>
nilai berada di sisi kiri ekspresi perbandingan. Itu berarti hasilnya <test-expression>
ada di sisi kanan, yang dapat dikonversi ke jenis nilai sisi kiri untuk perbandingan. Untuk informasi selengkapnya, lihat about_Comparison_Operators
Nilai default
dicadangkan untuk tindakan yang digunakan ketika tidak ada kecocokan lain.
Variabel $_
otomatis berisi nilai ekspresi yang diteruskan ke switch
pernyataan dan tersedia untuk dievaluasi dan digunakan dalam cakupan <result-to-be-matched>
pernyataan.
Sintaks pernyataan lengkapnya switch
adalah sebagai berikut:
switch [-regex | -wildcard | -exact] [-casesensitive] (<test-expression>)
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
or
switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
Jika tidak ada parameter yang digunakan, switch
bereaksi sama seperti menggunakan parameter Exact . Ini melakukan kecocokan yang tidak peka huruf besar/kecil untuk nilai . Jika nilainya adalah koleksi, setiap elemen dievaluasi dalam urutan munculnya.
Pernyataan switch
harus menyertakan setidaknya satu pernyataan kondisi.
Klausa default
dipicu ketika nilai tidak cocok dengan kondisi apa pun. Ini setara dengan klausul else
dalam pernyataan if
. Hanya satu default
klausa yang diizinkan dalam setiap switch
pernyataan.
switch
memiliki parameter berikut:
- Kartubebas - Menunjukkan bahwa kondisinya adalah string kartubebas. Jika klausul kecocokan bukan string, parameter diabaikan. Perbandingannya adalah tidak peka huruf besar/kecil.
- Persis - Menunjukkan bahwa klausul kecocokan, jika itu adalah string, harus sama persis. Jika klausul kecocokan bukan string, parameter ini diabaikan. Perbandingannya adalah tidak peka huruf besar/kecil.
- CaseSensitive - Melakukan kecocokan peka huruf besar/kecil. Jika klausul kecocokan bukan string, parameter ini diabaikan.
- File- Mengambil input dari file daripada
<test-expression>
. Jika beberapa parameter File disertakan, hanya yang terakhir yang digunakan. Setiap baris file dibaca dan dievaluasi olehswitch
pernyataan . Perbandingannya adalah tidak peka huruf besar/kecil. - Regex - Melakukan pencocokan ekspresi reguler dari nilai dengan kondisi. Jika klausul kecocokan bukan string, parameter ini diabaikan.
Perbandingannya adalah tidak peka huruf besar/kecil. Variabel
$matches
otomatis tersedia untuk digunakan dalam blok pernyataan yang cocok.
Catatan
Saat menentukan nilai yang bertentangan, seperti Regex dan Wildcard, parameter terakhir yang ditentukan lebih diutamakan, dan semua parameter yang bertentangan diabaikan. Beberapa instans parameter juga diizinkan. Namun, hanya parameter terakhir yang tercantum yang digunakan.
Contoh
Dalam contoh berikut, switch
pernyataan membandingkan nilai pengujian, 3, dengan setiap kondisi. Saat nilai pengujian cocok dengan kondisi, tindakan dilakukan.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
}
It is three.
Dalam contoh sederhana ini, nilai dibandingkan dengan setiap kondisi dalam daftar, meskipun ada kecocokan untuk nilai 3. Pernyataan berikut switch
memiliki dua kondisi untuk nilai 3. Ini menunjukkan bahwa, secara default, semua kondisi diuji.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
3 {"Three again."}
}
It is three.
Three again.
Untuk mengarahkan switch
agar berhenti membandingkan setelah kecocokan break
, gunakan pernyataan . Pernyataan tersebut break
mengakhiri switch
pernyataan.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."; Break}
4 {"It is four."}
3 {"Three again."}
}
It is three.
Jika nilai pengujian adalah koleksi, seperti array, setiap item dalam koleksi dievaluasi dalam urutan munculnya. Contoh berikut mengevaluasi 4 lalu 2.
switch (4, 2)
{
1 {"It is one." }
2 {"It is two." }
3 {"It is three." }
4 {"It is four." }
3 {"Three again."}
}
It is four.
It is two.
Pernyataan apa pun break
berlaku untuk koleksi, bukan untuk setiap nilai, seperti yang ditunjukkan dalam contoh berikut. Pernyataan switch
dihentikan oleh break
pernyataan dalam kondisi nilai 4.
switch (4, 2)
{
1 {"It is one."; Break}
2 {"It is two." ; Break }
3 {"It is three." ; Break }
4 {"It is four." ; Break }
3 {"Three again."}
}
It is four.
Dalam contoh ini, switch
pernyataan sedang menguji jenis nilai dalam hashtable. Anda harus menggunakan dan ekspresi yang mengembalikan nilai boolean untuk memilih blokir skrip yang akan dijalankan.
$var = @{A = 10; B = 'abc'}
foreach ($key in $var.Keys) {
switch ($var[$key].GetType()) {
{ $_ -eq [int32] } { "$key + 10 = $($var[$key] + 10)" }
{ $_ -eq [string] } { "$key = $($var[$key])" }
}
}
A + 10 = 20
B = abc
Dalam contoh ini, objek yang bukan string atau data numerik diteruskan ke switch
. switch
melakukan koersi string pada objek dan mengevaluasi hasilnya.
$test = @{
Test = 'test'
Test2 = 'test2'
}
$test.ToString()
switch -Exact ($test)
{
'System.Collections.Hashtable'
{
'Hashtable string coercion'
}
'test'
{
'Hashtable value'
}
}
System.Collections.Hashtable
Hashtable string coercion
Dalam contoh ini, tidak ada kasus yang cocok sehingga tidak ada output.
switch ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
}
Dengan menambahkan default
klausa, Anda dapat melakukan tindakan ketika tidak ada kondisi lain yang berhasil.
switch ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
Default {
"No matches"
}
}
No matches
Agar kata "empat belas" cocok dengan kasus, Anda harus menggunakan -Wildcard
parameter atau -Regex
.
PS> switch -Wildcard ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
}
That's too many.
Contoh berikut menggunakan -Regex
parameter .
$target = 'https://bing.com'
switch -Regex ($target)
{
'^ftp\://.*$' { "$_ is an ftp address"; Break }
'^\w+@\w+\.com|edu|org$' { "$_ is an email address"; Break }
'^(http[s]?)\://.*$' { "$_ is a web address that uses $($matches[1])"; Break }
}
https://bing.com is a web address that uses https
Contoh berikut menunjukkan penggunaan blok skrip sebagai switch
kondisi pernyataan.
switch ("Test")
{
{$_ -is [String]} {
"Found a string"
}
"Test" {
"This $_ executes as well"
}
}
Found a string
This Test executes as well
Contoh berikut memproses array yang berisi dua nilai tanggal. Membandingkan <value-scriptblock>
properti Tahun dari setiap tanggal. <action-scriptblock>
menampilkan pesan selamat datang atau jumlah hari hingga awal tahun 2022.
switch ((Get-Date 1-Jan-2022), (Get-Date 25-Dec-2021)) {
{ $_.Year -eq 2021 } {
$days = ((Get-Date 1/1/2022) - $_).days
"There are $days days until 2022."
}
{ $_.Year -eq 2022 } { 'Welcome to 2022!' }
}
Jika nilai cocok dengan beberapa kondisi, tindakan untuk setiap kondisi dijalankan. Untuk mengubah perilaku ini, gunakan break
kata kunci atau continue
.
Kata break
kunci berhenti memproses dan keluar dari switch
pernyataan.
Kata continue
kunci berhenti memproses nilai saat ini, tetapi terus memproses nilai berikutnya.
Contoh berikut memproses array angka dan ditampilkan jika ganjil atau genap. Angka negatif dilewati dengan continue
kata kunci. Jika non-angka ditemui, eksekusi dihentikan dengan break
kata kunci.
switch (1,4,-1,3,"Hello",2,1)
{
{$_ -lt 0} { continue }
{$_ -isnot [Int32]} { break }
{$_ % 2} {
"$_ is Odd"
}
{-not ($_ % 2)} {
"$_ is Even"
}
}
1 is Odd
4 is Even
3 is Odd