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 oleh switch 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

Lihat juga