Trước PowerShell 3
Hệ thống Kiểu mở rộng của PowerShell ban đầu không cho phép bạn tạo các kiểu cụ thể mà bạn có thể kiểm tra theo cách bạn đã làm trong tham số của mình. Nếu bạn không cần kiểm tra đó, bạn vẫn ổn với bất kỳ phương pháp nào khác được đề cập ở trên.
Nếu bạn muốn một kiểu thực tế mà bạn có thể truyền đến hoặc kiểm tra kiểu, như trong tập lệnh mẫu của bạn ... thì không thể thực hiện được nếu không viết nó trong C # hoặc VB.net và biên dịch. Trong PowerShell 2, bạn có thể sử dụng lệnh "Add-Type" để thực hiện khá đơn giản:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Lưu ý lịch sử : Trong PowerShell 1, điều đó thậm chí còn khó hơn. Bạn phải sử dụng CodeDom theo cách thủ công, có một chức năng rất cũscript new-struct trên PoshCode.org sẽ hữu ích. Ví dụ của bạn trở thành:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Sử dụng Add-Type
hoặc New-Struct
sẽ cho phép bạn thực sự kiểm tra lớp trong của bạn param([Contact]$contact)
và tạo ra những lớp mới bằng cách sử dụng $contact = new-object Contact
, v.v.
Trong PowerShell 3
Nếu bạn không cần một lớp "thực" mà bạn có thể truyền đến, bạn không cần phải sử dụng cách Add-Member mà Steven và những người khác đã trình bày ở trên.
Vì PowerShell 2, bạn có thể sử dụng tham số -Property cho New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
Và trong PowerShell 3, chúng tôi có khả năng sử dụng trình PSCustomObject
tăng tốc để thêm TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Bạn vẫn chỉ nhận được một đối tượng duy nhất, vì vậy bạn nên tạo một New-Contact
hàm để đảm bảo rằng mọi đối tượng đều xuất hiện giống nhau, nhưng bây giờ bạn có thể dễ dàng xác minh tham số "là" một trong những loại đó bằng cách trang trí một tham số với PSTypeName
thuộc tính:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
Trong PowerShell 5
Trong PowerShell 5 thay đổi tất cả mọi thứ, và cuối cùng chúng tôi đã nhận class
và enum
như từ khóa ngôn ngữ để xác định các loại (không có struct
nhưng đó là ok):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Chúng tôi cũng có một cách mới để tạo các đối tượng mà không cần sử dụng New-Object
: [Contact]::new()
- trên thực tế, nếu bạn giữ cho lớp của mình đơn giản và không xác định hàm tạo, bạn có thể tạo các đối tượng bằng cách ép kiểu bảng băm (mặc dù không có hàm tạo, sẽ không có cách nào để thực thi rằng tất cả các thuộc tính phải được đặt):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}