Bagikan melalui


6. Konversi

Catatan editorial

Penting

Windows PowerShell Language Specification 3.0 diterbitkan pada Desember 2012 dan didasarkan pada Windows PowerShell 3.0. Spesifikasi ini tidak mencerminkan status PowerShell saat ini. Tidak ada rencana untuk memperbarui dokumentasi ini untuk mencerminkan status saat ini. Dokumentasi ini disajikan di sini untuk referensi historis.

Dokumen spesifikasi tersedia sebagai dokumen Microsoft Word dari Pusat Unduhan Microsoft di: https://www.microsoft.com/download/details.aspx?id=36389 Dokumen Word telah dikonversi untuk presentasi di sini di Microsoft Learn. Selama konversi, beberapa perubahan editorial telah dilakukan untuk mengakomodasi pemformatan untuk platform Dokumen. Beberapa kesalahan ketik dan kesalahan kecil telah dikoreksi.

Konversi jenis dilakukan saat nilai dari satu jenis digunakan dalam konteks yang memerlukan jenis yang berbeda. Jika konversi seperti itu terjadi secara otomatis, itu dikenal sebagai konversi implisit. (Contoh umumnya adalah dengan beberapa operator yang perlu mengonversi satu atau beberapa nilai yang ditunjuk oleh operannya.) Konversi implisit diizinkan asalkan rasa nilai sumber dipertahankan, seperti tidak ada hilangnya presisi angka saat dikonversi.

Operator cast (§7.2.9) memungkinkan untuk konversi eksplisit .

Konversi dibahas di bawah ini, dengan informasi tambahan diberikan seperlunya dalam deskripsi setiap operator di §6,19.

Konversi eksplisit nilai ke jenis yang sudah tidak menyebabkan perubahan pada nilai tersebut atau representasinya.

Aturan untuk menyerahkan konversi ketika nilai ekspresi sedang terikat ke parameter tercakup dalam §6,17.

6.1 Konversi ke batal

Nilai jenis apa pun dapat dibuang secara eksplisit dengan mengubahnya ke tipe void. Tidak ada hasil.

6.2 Konversi ke bool

Aturan untuk mengonversi nilai apa pun ke jenis bool adalah sebagai berikut:

  • Nilai numerik atau karakter nol dikonversi ke False; nilai numerik atau karakter non-nol dikonversi ke True.
  • Nilai jenis null dikonversi ke False.
  • String panjang 0 dikonversi ke False; string panjang > 0 dikonversi ke True.
  • Parameter sakelar dengan nilai $true dikonversi ke True, dan satu dengan nilai $false dikonversi ke False.
  • Semua nilai jenis referensi non-null lainnya dikonversi ke True.

Jika jenis mengimplementasikan IList:

  • Jika Panjang objek > 2, nilai dikonversi ke True.
  • Jika Panjang objek adalah 1 dan elemen pertama itu bukan itu sendiri IList, maka jika nilai elemen tersebut benar, nilai dikonversi ke True.
  • Jika tidak, jika hitungan elemen pertama >= 1, nilai dikonversi ke True.
  • Jika tidak, nilai dikonversi ke False.

6.3 Konversi ke karakter

Aturan untuk mengonversi nilai apa pun ke jenis karakter adalah sebagai berikut:

  • Konversi nilai dari tipe bool, desimal, float, atau double terjadi kesalahan.
  • Nilai jenis null dikonversi ke karakter null (U+0000).
  • Suatu nilai bertipe integer yang nilainya dapat diwakili dalam tipe char akan memiliki nilai tersebut; jika tidak, konversi akan menghasilkan kesalahan.
  • Konversi nilai string yang memiliki panjang selain 1 mengalami kesalahan.
  • Nilai string yang memiliki panjang 1 dikonversi ke karakter yang memiliki nilai satu karakter tersebut.
  • Nilai tipe numerik yang, setelah pembulatan bagian pecahan apa pun, dapat diwakili dalam tipe tujuan akan memiliki nilai yang dibulatkan tersebut; jika tidak, konversi mengalami kesalahan.
  • Untuk nilai jenis referensi lainnya, jika jenis referensi mendukung konversi seperti itu, konversi tersebut digunakan; jika tidak, konversi dalam kesalahan.

6.4 Konversi ke bilangan bulat

Aturan untuk mengonversi nilai apa pun ke tipe byte, int, atau long adalah sebagai berikut:

  • Nilai bool False dikonversi menjadi nol; nilai bool True dikonversi menjadi 1.
  • Nilai tipe char yang nilainya dapat diwakili dalam tipe tujuan memiliki nilai tersebut; jika tidak, konversi mengalami kesalahan.
  • Nilai tipe numerik yang nilainya setelah pembulatan bagian pecahan apa pun dapat diwakili dalam tipe tujuan memiliki nilai bulat tersebut; jika tidak, konversi mengalami kesalahan.
  • Nilai jenis null dikonversi menjadi nol.
  • String yang mewakili angka dikonversi seperti yang dijelaskan dalam §6,16. Jika setelah pemotongan bagian pecahan, hasilnya dapat dinyatakan dalam tipe tujuan, maka string memiliki bentuk yang benar dan memiliki tipe tujuan tersebut; jika tidak, terjadi kesalahan konversi. Jika string tidak mewakili angka, konversi mengalami kesalahan.
  • Untuk nilai jenis referensi lainnya, jika jenis referensi mendukung konversi seperti itu, konversi tersebut digunakan; jika tidak, konversi dalam kesalahan.

6.5 Konversi ke float dan double

Aturan untuk mengonversi nilai apa pun ke tipe float atau double adalah sebagai berikut:

  • Nilai bool False dikonversi menjadi nol; nilai bool True dikonversi menjadi 1.
  • Nilai karakter diwakili dengan tepat.
  • Nilai tipe numerik diwakili dengan tepat, jika memungkinkan; namun, untuk konversi int, long, dan desimal ke float, dan untuk konversi long dan desimal ke double, beberapa bit paling tidak signifikan dari nilai bilangan bulat mungkin hilang.
  • Nilai jenis null dikonversi menjadi nol.
  • String yang mewakili angka dikonversi seperti yang dijelaskan dalam §6.16; jika tidak, konversi akan menghasilkan kesalahan.
  • Untuk nilai jenis referensi lainnya, jika jenis referensi mendukung konversi seperti itu, konversi tersebut digunakan; jika tidak, konversi dalam kesalahan.

6.6 Konversi ke desimal

Aturan untuk mengonversi nilai apa pun ke jenis desimal adalah sebagai berikut:

  • Nilai bool False dikonversi menjadi nol; nilai bool True dikonversi menjadi 1.
  • Nilai jenis karakter diwakili dengan tepat.
  • Nilai jenis numerik diwakili dengan tepat; namun, jika nilai tersebut terlalu besar atau terlalu kecil untuk masuk dalam tipe tujuan, konversi tersebut menjadi tidak valid.
  • Nilai jenis null dikonversi menjadi nol.
  • String yang mewakili angka dikonversi seperti yang dijelaskan dalam §6,16; jika tidak, konversi dalam kesalahan.
  • Untuk nilai jenis referensi lainnya, jika jenis referensi mendukung konversi seperti itu, konversi tersebut digunakan; jika tidak, konversi dalam kesalahan.
  • Skala hasil konversi yang berhasil sedemikian rupa sehingga bagian pecahan tidak memiliki nol di belakangnya.

6.7 Konversi ke objek

Nilai jenis apa pun kecuali jenis null (4.1.2) dapat dikonversi ke objek jenis. Nilai mempertahankan jenis dan representasinya.

6.8 Konversi ke string

Aturan untuk mengonversi nilai apa pun ke string jenis adalah sebagai berikut:

  • Nilai bool $false dikonversi menjadi "False"; nilai bool $true dikonversi ke "True".
  • Nilai jenis karakter dikonversi ke string 1 karakter yang berisi karakter tersebut.
  • Nilai jenis numerik dikonversi ke string yang memiliki bentuk literal numerik yang sesuai. Namun, hasilnya tidak memiliki spasi di awal atau di akhir, tidak ada tanda plus di awal, bilangan bulat memiliki basis 10, dan tidak ada akhiran tipe. Untuk konversi desimal, skala dipertahankan. Untuk nilai -∞, +∞, dan NaN, string yang dihasilkan masing-masing adalah "-Infinity", "Infinity", dan "NaN".
  • Nilai jenis null dikonversi ke string kosong.
  • Untuk array 1 dimensi, hasilnya adalah string yang berisi nilai setiap elemen dalam array tersebut, dari awal hingga akhir, dikonversi menjadi string, dengan elemen yang dipisahkan oleh Pemisah Bidang Output saat ini (§2.3.2.2). Untuk array yang memiliki elemen yang merupakan array itu sendiri, hanya elemen tingkat atas yang dikonversi. String yang digunakan untuk mewakili nilai elemen yang merupakan array, ditentukan implementasinya. Untuk array multi-dimensi, diratakan (§9,12) dan kemudian diperlakukan sebagai array 1-dimensi.
  • Nilai jenis null dikonversi ke string kosong.
  • Nilai jenis blok skrip dikonversi ke string yang berisi teks blok tersebut tanpa karakter { dan } yang dibatasi.
  • Untuk nilai jenis enumerasi, hasilnya adalah string yang berisi nama setiap konstanta enumerasi yang dikodekan dalam nilai tersebut, dipisahkan oleh koma.
  • Untuk nilai jenis referensi lainnya, jika jenis referensi mendukung konversi seperti itu, konversi tersebut digunakan; jika tidak, konversi dalam kesalahan.

String yang digunakan untuk mewakili nilai elemen yang merupakan array memiliki formulir System.type[], System.type[,], dan sebagainya. Untuk jenis referensi lainnya, metode ToString dipanggil. Untuk jenis lain yang dapat dijumlahkan, nilai sumber diperlakukan seperti array 1 dimensi.

6.9 Konversi ke array

Aturan untuk mengonversi nilai apa pun ke jenis array adalah sebagai berikut:

  • Jenis target mungkin tidak boleh berupa array multidimensi.
  • Nilai jenis null dipertahankan apa adanya.
  • Untuk nilai skalar selain $null atau nilai jenis hashtable, array 1 elemen baru dibuat yang nilainya adalah skalar setelah konversi ke jenis elemen target.
  • Untuk nilai array 1 dimensi, array baru dengan tipe target dibuat, dan setiap elemen dipindahkan dengan konversi dari array sumber ke elemen yang sesuai dalam array target.
  • Untuk nilai array multi-dimensi, array tersebut pertama kali dipipihkan (§9.12), lalu diperlakukan sebagai nilai array satu dimensi.
  • Nilai string dikonversi ke array karakter yang memiliki panjang yang sama dengan karakter berturut-turut dari string yang menempati posisi yang sesuai dalam array.

Untuk tipe enumerable lainnya, sebuah array baru dengan 1 elemen dibuat, yang nilainya adalah elemen terkait setelah dikonversi ke tipe elemen target, jika konversi seperti itu ada. Jika sebaliknya, konversi mengalami kesalahan.

6.10 Konversi ke xml

Objek dikonversi menjadi string jenis lalu menjadi objek Dokumen XML jenis xml.

6.11 Konversi ke regex

Ekspresi yang menunjuk nilai string jenis dapat dikonversi ke jenis regex.

6.12 Konversi ke blok skrip

Aturan untuk mengonversi nilai apa pun ke jenis scriptblock adalah sebagai berikut:

  • Nilai string diperlakukan sebagai nama perintah yang secara opsional diikuti oleh argumen untuk panggilan ke perintah tersebut.

6.13 Konversi ke jenis enumerasi

Aturan untuk mengonversi nilai apa pun ke jenis enumerasi adalah sebagai berikut:

  • Nilai string jenis yang berisi salah satu nilai bernama (sehubungan dengan kasus) untuk jenis enumerasi dikonversi ke nilai bernama tersebut.
  • Nilai string jenis yang berisi daftar nilai bernama yang dipisahkan koma (sehubungan dengan kasus) untuk jenis enumerasi dikonversi ke bitwise-OR dari semua nilai bernama tersebut.

6.14 Konversi ke jenis referensi lainnya

Aturan untuk mengonversi nilai apa pun ke jenis referensi selain jenis array atau string adalah sebagai berikut:

  • Nilai jenis null dipertahankan apa adanya.
  • Jika tidak, perilaku ditentukan oleh implementasi.

Sejumlah mekanisme penggunaan berperan di sini; ini termasuk kemungkinan penggunaan konstruktor dengan argumen tunggal atau konstruktor default jika nilainya adalah sebuah hashtable, operator konversi implisit dan eksplisit, serta metode Parse untuk jenis target; penggunaan Convert.ConvertTo; dan mekanisme konversi ETS.

6.15 Konversi aritmatika biasa

Jika tidak ada operand yang menunjuk nilai yang memiliki jenis numerik, maka

  • Jika operand kiri menunjuk nilai jenis bool, terjadi kesalahan dalam konversi.
  • Jika tidak, semua operand yang menunjuk nilai $null dikonversi ke nol jenis int dan proses berlanjut dengan konversi numerik yang tercantum di bawah ini.
  • Jika tidak, jika operand kiri menunjuk nilai jenis char dan operand kanan menunjuk nilai jenis bool, terjadi kesalahan pada konversi.
  • Jika tidak, jika operand kiri mengacu pada nilai dari tipe string tetapi tidak mewakili angka (§6.16), terjadi kesalahan dalam konversi.
  • Jika tidak, jika operand kanan menunjuk nilai bertipe string tetapi tidak mewakili angka (§6.16), terjadi kesalahan pada konversi.
  • Jika tidak, semua operan yang menunjuk nilai string jenis dikonversi ke angka (§6,16), dan proses berlanjut dengan konversi numerik yang tercantum di bawah ini.
  • Jika tidak, konversi mengalami kesalahan.

Konversi numerik:

  • Jika satu operand menunjuk nilai jenis desimal, nilai yang ditunjuk oleh operand lain dikonversi ke jenis tersebut, jika perlu. Hasilnya memiliki tipe desimal.
  • Jika tidak, jika satu operand menunjuk nilai jenis ganda, nilai yang ditunjuk oleh operand lain dikonversi ke jenis tersebut, jika perlu. Hasilnya memiliki tipe double.
  • Sebaliknya, jika satu operand menunjuk nilai jenis float, nilai yang ditunjuk oleh kedua operand dikonversi ke jenis double, jika perlu. Hasilnya memiliki tipe double.
  • Jika tidak, jika salah satu operand menunjuk nilai tipe long, nilai yang ditunjuk oleh operand lainnya dikonversi ke tipe tersebut, jika perlu. Hasilnya memiliki jenis pertama dalam urutan panjang dan ganda yang dapat mewakili nilainya.
  • Selain itu, nilai yang ditunjuk oleh kedua operand dikonversi ke jenis int, jika perlu. Hasilnya adalah yang pertama dalam urutan int, long, double yang dapat mewakili nilainya tanpa pemangkasan.

6.16 Konversi dari string ke jenis numerik

Bergantung pada kontennya, string dapat dikonversi secara eksplisit atau implisit ke nilai numerik. Khusus

  • String kosong dikonversi ke nilai nol.
  • Spasi di depan dan belakang diabaikan; namun, string mungkin tidak terdiri dari spasi saja.
  • String yang hanya berisi spasi putih dan/atau terminator garis dikonversi ke nilai nol.
  • Satu tanda awal + atau - diizinkan.
  • Bilangan bulat mungkin memiliki awalan heksadesimal (0x atau 0X).
  • Eksponen dengan tanda opsional diizinkan.
  • Akhiran jenis dan perkalian tidak diizinkan.
  • String yang berbeda huruf besar/kecil "-Infinity", "Infinity", dan "NaN" masing-masing dikenali sebagai nilai -∞, +∞, dan NaN.

6.17 Konversi selama pengikatan parameter

Untuk informasi tentang pengikatan parameter, lihat §8,14.

Saat nilai ekspresi terikat ke parameter, ada pertimbangan konversi tambahan, seperti yang dijelaskan di bawah ini:

  • Jika jenis parameter adalah switch (§4.2.5, §8.10.5) dan parameter tidak memiliki argumen, nilai parameter dalam perintah yang disebut diatur ke $true. Jika jenis parameter selain switch, parameter yang tidak memiliki argumen mengalami kesalahan.
  • Jika jenis parameter adalah tipe saklar, dan nilai argumen adalah $null, maka nilai parameter diatur ke $false.
  • Jika jenis parameter adalah objek atau sama dengan jenis argumen, nilai argumen diteruskan tanpa konversi.
  • Jika jenis parameter bukan objek atau blok skrip, argumen yang memiliki jenis blok skrip dievaluasi dan hasilnya diteruskan sebagai nilai argumen. (Ini dikenal sebagai pengikatan blok skrip tertunda.) Jika jenis parameter adalah objek atau blok skrip, argumen yang memiliki jenis blok skrip diteruskan apa adanya.
  • Jika jenis parameter adalah kumpulan jenis T2, dan argumen adalah skalar jenis T1, skalar tersebut dikonversi ke kumpulan jenis T2 yang berisi satu elemen. Jika perlu, nilai skalar dikonversi ke jenis T2 menggunakan aturan konversi bagian ini.
  • Jika jenis parameter adalah jenis skalar selain objek dan argumen adalah koleksi, ada kesalahan pada argumen.
  • Jika jenis parameter yang diharapkan adalah kumpulan tipe T2, dan argumen adalah kumpulan tipe T1, argumen dikonversi ke kumpulan tipe T2 yang memiliki panjang yang sama dengan koleksi argumen. Jika perlu, nilai elemen pengumpulan argumen dikonversi ke jenis T2 menggunakan aturan konversi bagian ini.
  • Jika langkah-langkah di atas dan konversi yang ditentukan sebelumnya dalam bab ini tidak cukup, aturan dalam §6,18 diterapkan. Jika gagal, pengikatan parameter gagal.

Konversi .NET 6.18

Untuk konversi implisit, konversi bawaan PowerShell dicoba terlebih dahulu. Jika mereka tidak dapat menyelesaikan konversi, konverter kustom .NET di bawah ini dicoba, secara berurutan, dari atas ke bawah. Jika konversi ditemukan, tetapi menghasilkan pengecualian, konversi tersebut gagal.

  • PSTypeConverter: Ada dua cara untuk mengaitkan implementasi kelas PSTypeConverter dengan kelas targetnya: melalui file konfigurasi jenis (type.ps1xml) atau dengan menerapkan atribut ke kelas target. Lihat dokumentasi PowerShell SDK untuk informasi selengkapnya.

  • TypeConverter: Jenis CLR ini menyediakan cara terpadu untuk mengonversi jenis nilai ke jenis lain, serta untuk mengakses nilai standar dan sub-properti. Jenis pengonversi yang paling umum adalah konverter yang mengonversi ke dan dari representasi teks. Pengonversi jenis untuk kelas terikat ke kelas dengan System.ComponentModel.TypeConverterAttribute. Kecuali atribut ini digantikan, semua kelas yang mewarisi dari kelas ini menggunakan pengonversi jenis yang sama dengan kelas dasar. Lihat dokumentasi PowerShell SDK dan kerangka kerja Microsoft .NET untuk informasi selengkapnya.

  • Metode Penguraian: Jika jenis sumber adalah string dan jenis tujuan memiliki metode yang disebut Parse, metode tersebut dipanggil untuk melakukan konversi.

  • Konstruktor: Jika jenis tujuan memiliki konstruktor yang mengambil argumen tunggal yang jenisnya adalah jenis sumber, konstruktor tersebut dipanggil untuk melakukan konversi.

  • Operator Cast Implisit: Jika tipe sumber memiliki operator cast implisit yang mengubah ke tipe tujuan, operator tersebut dipanggil untuk melakukan konversi.

  • Operator Cast Eksplisit: Jika tipe sumber memiliki operator cast eksplisit yang mengonversi ke tipe tujuan, operator tersebut akan dipanggil untuk melakukan konversi. Jika jenis tujuan memiliki operator cast eksplisit yang mengonversi dari jenis sumber, operator tersebut dipanggil untuk melakukan konversi.

  • IConvertable: System.Convert.ChangeType dipanggil untuk melakukan konversi.

6.19 Konversi yang dipesan

Aturan untuk mengonversi nilai apa pun ke jenis pseudo yang diurutkan adalah sebagai berikut:

  • Jika nilainya adalah hash literal (§2.3.5.6), hasilnya adalah objek dengan jenis implementasi yang ditentukan yang bereaksi seperti hashtable dan urutan kunci cocok dengan urutan yang ditentukan dalam literal hash.
  • Jika tidak, perilakunya ditentukan oleh implementasi.

Hanya literal hash (§2.3.5.6) yang dapat dikonversi menjadi terurut. Hasilnya adalah instance System.Collections.Specialized.OrderedDictionary.

6.20 Konversi ke pscustomobject

Aturan untuk mengonversi nilai apa pun ke pscustomobject jenis pseudo adalah sebagai berikut:

  • Nilai jenis hashtable dikonversi ke objek PowerShell. Setiap kunci dalam hashtable menjadi NoteProperty dengan nilai yang sesuai.
  • Jika tidak, perilaku ditentukan oleh implementasi.

Konversi selalu diizinkan tetapi tidak mengubah jenis nilai.