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-Typeatau New-Structakan membiarkan Anda benar-benar menguji kelas di Anda param([Contact]$contact)dan membuat yang baru menggunakan $contact = new-object Contactdan 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 PSCustomObjectakselerator untuk menambahkan TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Anda masih hanya mendapatkan satu objek, jadi Anda harus membuat New-Contactfungsi 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 PSTypeNameatribut:
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 classdan enumsebagai kata kunci bahasa untuk menentukan jenis (tidak ada structtapi 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"
}