ก่อนหน้า PowerShell 3
ระบบ Extensible Type ของ PowerShell ไม่ได้ให้คุณสร้างประเภทคอนกรีตที่คุณสามารถทดสอบกับวิธีที่คุณทำในพารามิเตอร์ของคุณได้ หากคุณไม่ต้องการการทดสอบนั้นคุณสามารถใช้วิธีการอื่น ๆ ที่กล่าวถึงข้างต้นได้
หากคุณต้องการประเภทจริงที่คุณสามารถแคสต์หรือพิมพ์ตรวจสอบได้ดังในสคริปต์ตัวอย่างของคุณ ... ไม่สามารถทำได้โดยไม่ต้องเขียนใน C # หรือ VB.net และรวบรวม ใน PowerShell 2 คุณสามารถใช้คำสั่ง "Add-Type" เพื่อทำให้ง่ายขึ้น:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
หมายเหตุทางประวัติศาสตร์ : ใน PowerShell 1 นั้นยากยิ่งกว่า คุณต้องใช้ CodeDom ด้วยตนเองมีสคริปต์ new-struct ของฟังก์ชันเก่ามากบน PoshCode.org ซึ่งจะช่วยได้ ตัวอย่างของคุณกลายเป็น:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
การใช้Add-Type
หรือNew-Struct
จะให้คุณทดสอบชั้นเรียนในของคุณparam([Contact]$contact)
และสร้างใหม่โดยใช้$contact = new-object Contact
และอื่น ๆ ...
ใน PowerShell 3
หากคุณไม่ต้องการคลาส "ของจริง" ที่คุณสามารถแคสต์ได้คุณไม่จำเป็นต้องใช้วิธีการเพิ่มสมาชิกที่สตีเวนและคนอื่น ๆ ได้แสดงไว้ข้างต้น
เนื่องจาก PowerShell 2 คุณสามารถใช้พารามิเตอร์ -Property สำหรับ New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
และใน PowerShell 3 เรามีความสามารถในการใช้PSCustomObject
ตัวเร่งความเร็วเพื่อเพิ่ม TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
คุณยังคงได้รับออบเจ็กต์เดียวเท่านั้นดังนั้นคุณควรสร้างNew-Contact
ฟังก์ชันเพื่อให้แน่ใจว่าทุกออบเจ็กต์ออกมาเหมือนกัน แต่ตอนนี้คุณสามารถตรวจสอบพารามิเตอร์ "เป็น" หนึ่งในประเภทนั้นได้อย่างง่ายดายโดยการตกแต่งพารามิเตอร์ด้วยPSTypeName
แอตทริบิวต์:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
ใน PowerShell 5
ใน PowerShell 5 ทุกอย่างเปลี่ยนแปลงและในที่สุดเราก็ได้class
และenum
เป็นคำหลักภาษาสำหรับการกำหนดประเภท (ไม่มีstruct
แต่ก็ไม่เป็นไร):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
นอกจากนี้เรายังมีวิธีใหม่ในการสร้างวัตถุโดยไม่ต้องใช้New-Object
: [Contact]::new()
- อันที่จริงถ้าคุณทำให้ชั้นเรียนของคุณเรียบง่ายและไม่ได้กำหนดตัวสร้างคุณสามารถสร้างวัตถุได้โดยการส่งแฮชแท็ก (แม้ว่าจะไม่มีตัวสร้าง แต่ก็ไม่มีทาง เพื่อบังคับว่าต้องตั้งค่าคุณสมบัติทั้งหมด):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}