Bagikan melalui


tentang_Switch

Deskripsi singkat

Menjelaskan cara menggunakan sakelar untuk menangani beberapa pernyataan bersyarah.

Deskripsi panjang

Untuk memeriksa kondisi dalam skrip atau fungsi, Anda dapat menggunakan if pernyataan. Pernyataan if dapat memeriksa banyak jenis kondisi, termasuk nilai variabel dan properti objek.

Untuk memeriksa beberapa kondisi, Anda dapat menggunakan switch pernyataan. Pernyataan switch ini mirip dengan serangkaian if pernyataan, tetapi lebih sederhana. Pernyataan mencantumkan switch setiap kondisi dan tindakan yang sesuai. Jika kondisi cocok, tindakan dilakukan.

Penting

Pernyataan mengonversi switch semua nilai menjadi string sebelum perbandingan.

Syntax

Pernyataan switch dasar memiliki format berikut:

switch (<test-expression>) {
    <result1-to-be-matched> {<action-statement>}
    <result2-to-be-matched> {<action-statement>}
}

Sintaks switch pernyataan mirip dengan pernyataan berikut if :

if ("$(<result1-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
if ("$(<result2-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}

Ekspresi mencakup nilai harfiah (string atau angka), variabel, dan blok skrip yang mengembalikan nilai boolean. Pernyataan mengonversi switch semua nilai menjadi string sebelum perbandingan. Misalnya, lihat Dampak konversi string nanti di artikel ini.

<test-expression> dievaluasi dalam mode ekspresi. Jika ekspresi mengembalikan lebih dari satu nilai, seperti array atau jenis enumerable lainnya, switch pernyataan mengevaluasi setiap nilai yang dijumlahkan secara terpisah.

<result-to-be-matched> adalah ekspresi harus diselesaikan ke satu nilai. Nilai tersebut dibandingkan dengan nilai input.

Nilai default dicadangkan untuk tindakan yang digunakan ketika tidak ada kecocokan lain.

Pernyataan switch dapat menggunakan variabel otomatis $_ dan $switch. Variabel otomatis berisi nilai ekspresi yang diteruskan ke switch pernyataan dan tersedia untuk dievaluasi dan digunakan dalam cakupan <result-to-be-matched> pernyataan. Untuk informasi selengkapnya, lihat about_Automatic_Variables.

Sintaks pernyataan switch lengkap adalah sebagai berikut:

switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] (<test-expression>) {
    string | number | variable | { <value-scriptblock> }
        { <action-statement> }
    default { <action-statement> } # optional
}

atau

switch [-Regex | -Wildcard | -Exact] [-CaseSensitive] -File filename {
    string | number | variable | { <value-scriptblock> }
        { <action-statement> }
    default { <action-statement> }  # optional
}

Jika Anda tidak menggunakan parameter, switch bereaksi sama seperti menggunakan parameter Persis. 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 klausa else dalam pernyataan if. Hanya satu klausa default yang diizinkan dalam setiap pernyataan switch.

switch memiliki parameter berikut:

  • Wildcard - Menunjukkan bahwa kondisinya adalah string kartubebas. Jika klausul kecocokan bukan string, parameter diabaikan. Perbandingannya tidak peka huruf besar/kecil.
  • Exact - Menunjukkan bahwa klausul kecocokan, jika string, harus sama persis. Jika klausa kecocokan bukan string, parameter ini diabaikan. Perbandingannya 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>. File membaca baris pada satu waktu dan dievaluasi oleh pernyataan switch. Secara bawaan, perbandingannya tidak sensitif terhadap huruf besar/kecil. Parameter File hanya mendukung satu file. Jika beberapa parameter File disertakan, hanya yang terakhir yang digunakan. Untuk informasi selengkapnya, lihat Contoh parameter file.
  • Regex - Melakukan pencocokan ekspresi reguler nilai dengan kondisi. Jika klausa kecocokan bukan string, parameter ini diabaikan. Perbandingannya tidak peka huruf besar/kecil. Variabel otomatis $Matches tersedia untuk digunakan dalam blok pernyataan yang cocok.

Nota

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.

Examples

Contoh berikut menunjukkan penggunaan switch pernyataan.

Contoh kecocokan sederhana

Dalam contoh berikut, pernyataan switch membandingkan nilai pengujian 3 dengan setiap kondisi. Saat nilai pengujian cocok dengan kondisi, tindakan dilakukan.

switch (3) {
    1 { "It's one."   }
    2 { "It's two."   }
    3 { "It's three." }
    4 { "It's four."  }
}
It's three.

Dalam contoh ini, nilai dibandingkan dengan setiap kondisi dalam daftar. Pernyataan switch berikut memiliki dua kondisi untuk nilai 3, yang menunjukkan bahwa semua kondisi diuji.

switch (3) {
    1 { "It's one."    }
    2 { "It's two."    }
    3 { "It's three."  }
    4 { "It's four."   }
    3 { "Three again." }
}
It's three.
Three again.

Menggunakan break dan continue untuk mengontrol alur

Jika nilai cocok dengan beberapa kondisi, tindakan untuk setiap kondisi dijalankan. Untuk mengubah perilaku ini, gunakan kata kunci break atau continue.

Kata kunci break berhenti memproses dan keluar dari pernyataan switch.

Kata kunci continue 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 kata kunci continue. Jika non-angka ditemukan, eksekusi dihentikan dengan kata kunci break.

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

Dampak konversi string

Semua nilai, baik input maupun nilai perbandingan dikonversi ke string untuk perbandingan. Untuk menghindari konversi string yang tidak diinginkan, gunakan blokir skrip untuk mengevaluasi nilai pengalihan.

switch ( ([datetime]'1 Jan 1970').DayOfWeek ) {
    4            { 'The integer value matches a Thursday.' }
    "4"          { 'The numeric string matches a Thursday.' }
    "Thursday"   { 'The string value matches a Thursday.' }
    { 4 -eq $_ } { 'The expression matches a Thursday.' }
}

Properti DayOfWeek dari objek tanggal adalah enumerasi. Meskipun enumerasi dapat dibandingkan dengan nilai numerik atau stringnya, switch pernyataan mengonversi nilai menjadi representasi string enumerasi.

The string value matches a Thursday.
The expression matches a Thursday.

Perilaku ini berbeda dari perilaku perbandingan -eq dalam pernyataan if .

if (4 -eq ([datetime]'1 Jan 1970').DayOfWeek) {
    'The integer value matches a Thursday.'
}
The value matches a Thursday.

Dalam contoh ini, hashtable diteruskan ke switch pernyataan . Mengonversi switch hashtable menjadi string.

$test = @{
    Test  = 'test'
    Test2 = 'test2'
}

$test.ToString()
System.Collections.Hashtable

Perhatikan bahwa representasi string dari hashtable tidak sama dengan nilai kunci Uji .

switch -Exact ($test) {
    'System.Collections.Hashtable' { 'Hashtable string coercion' }
    'test'                         { 'Hashtable value' }
}
Hashtable string coercion

Gunakan switch untuk menguji nilai dalam hashtable

Dalam contoh ini, pernyataan switch menguji jenis nilai dalam hashtable. Kita harus menghitung item dalam hashtable sebelum kita dapat menguji nilai. Untuk menghindari komplikasi konversi string, gunakan blokir skrip yang mengembalikan nilai boolean untuk memilih pernyataan tindakan 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

Menggunakan kartubebas dengan switch

Dalam contoh ini, tidak ada kasus yang cocok sehingga tidak ada output.

switch ("fourteen") {
    1     { "It's one.";   break }
    2     { "It's two.";   break }
    3     { "It's three."; break }
    4     { "It's four.";  break }
    "fo*" { "That's too many."   }
}

Dengan menambahkan klausa default, Anda dapat melakukan tindakan ketika tidak ada kondisi lain yang berhasil.

switch ("fourteen") {
    1       { "It's one.";   break }
    2       { "It's two.";   break }
    3       { "It's three."; break }
    4       { "It's four.";  break }
    "fo*"   { "That's too many."   }
    default { "No matches"         }
}
No matches

Agar kata fourteen cocok dengan kasus, Anda harus menggunakan parameter -Wildcard atau -Regex.

switch -Wildcard ("fourteen") {
    1     { "It's one.";   break }
    2     { "It's two.";   break }
    3     { "It's three."; break }
    4     { "It's four.";  break }
    "fo*" { "That's too many."   }
}
That's too many.

Menggunakan ekspresi reguler dengan switch

Contoh berikut menggunakan parameter -Regex.

$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 blokir 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. <value-scriptblock> membandingkan properti Tahun dari setiap tanggal. <action-statement> 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!' }
}

Membaca konten file dengan switch

Menggunakan pernyataan switch dengan parameter File adalah cara yang efisien untuk memproses file besar secara baris demi baris. PowerShell mengalirkan baris file ke pernyataan switch. Setiap baris diproses satu per satu.

Anda dapat mengakhiri pemrosesan sebelum mencapai akhir file dengan menggunakan kata kunci break dalam pernyataan tindakan. Pernyataan switch lebih efisien daripada menggunakan Get-Content untuk memproses file besar baris demi baris.

Anda dapat menggabungkan switch -File dengan -Wildcard atau -Regex untuk pencocokan pola baris demi baris yang fleksibel dan efisien.

Contoh berikut membaca README.md di repositori PowerShell-Docs. Ini menghasilkan setiap baris sampai mencapai garis yang dimulai dengan ##.

switch -Regex -File .\README.md {
    '^##\s' { break }
    default { $_; continue }
}

Argumen <filename> menerima ekspresi kartubebas, tetapi hanya harus cocok dengan satu file. Contoh berikut sama dengan yang sebelumnya kecuali menggunakan kartubebas dalam argumen <filename>. Contoh ini berfungsi karena pola kartubebas hanya cocok dengan satu file.

switch -Regex -File .\README.* {
    '^##\s' { break }
    default { $_; continue }
}

Anda harus menghindari karakter yang dapat ditafsirkan sebagai kartubebas jika Anda ingin karakter tersebut diperlakukan sebagai harfiah.

$file = (New-Item -Path 'Temp:\Foo[0]' -Value Foo -Force).FullName
switch -File $file { Foo { 'Foo' } }
# No files matching '...\Temp\Foo[0]' were found.

$fileEscaped = [WildcardPattern]::Escape($file)
switch -File $fileEscaped { foo { 'Foo' } }
# Foo

Lihat juga