Sebelum PowerShell 3
Sistem Jenis Dapat Diperluas PowerShell awalnya tidak memungkinkan Anda membuat jenis konkret yang dapat Anda uji dengan cara yang Anda lakukan di parameter Anda. Jika Anda tidak memerlukan tes itu, Anda baik-baik saja dengan metode lain yang disebutkan di atas.
Jika Anda menginginkan tipe aktual yang dapat Anda transmisikan atau gunakan pemeriksaan ketik, seperti dalam contoh skrip Anda ... itu tidak dapat dilakukan tanpa menuliskannya di C # atau VB.net dan kompilasi. Di PowerShell 2, Anda dapat menggunakan perintah "Add-Type" untuk melakukannya dengan cukup sederhana:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Catatan Sejarah : Di PowerShell 1 bahkan lebih sulit. Anda harus menggunakan CodeDom secara manual, ada fungsiskrip new-struct yang sangat lamadi PoshCode.org yang akan membantu. Contoh Anda menjadi:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Menggunakan Add-Type
atau New-Struct
akan membiarkan Anda benar-benar menguji kelas di Anda param([Contact]$contact)
dan membuat yang baru menggunakan $contact = new-object Contact
dan seterusnya ...
Di PowerShell 3
Jika Anda tidak memerlukan kelas "nyata" yang dapat Anda gunakan untuk melakukan cast, Anda tidak harus menggunakan cara Tambah Anggota seperti yang ditunjukkan Steven dan orang lain di atas.
Sejak PowerShell 2 Anda dapat menggunakan parameter -Property untuk New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
Dan di PowerShell 3, kami mendapatkan kemampuan untuk menggunakan PSCustomObject
akselerator untuk menambahkan TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Anda masih hanya mendapatkan satu objek, jadi Anda harus membuat New-Contact
fungsi untuk memastikan bahwa setiap objek keluar sama, tetapi sekarang Anda dapat dengan mudah memverifikasi parameter "adalah" salah satu dari jenis itu dengan menghias parameter dengan PSTypeName
atribut:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
Di PowerShell 5
Di PowerShell 5 semuanya berubah, dan kami akhirnya mendapatkan class
dan enum
sebagai kata kunci bahasa untuk menentukan jenis (tidak ada struct
tapi tidak apa-apa):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Kami juga mendapatkan cara baru untuk membuat objek tanpa menggunakan New-Object
: [Contact]::new()
- pada kenyataannya, jika Anda membuat kelas Anda tetap sederhana dan tidak mendefinisikan konstruktor, Anda dapat membuat objek dengan mentransmisikan hashtable (meskipun tanpa konstruktor, tidak mungkin untuk menegakkan bahwa semua properti harus disetel):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}