До PowerShell 3
Розширювана система типів PowerShell спочатку не дозволяла вам створювати конкретні типи, які ви можете перевірити як у вашому параметрі. Якщо вам не потрібен цей тест, ви добре працюєте з будь-яким із інших методів, згаданих вище.
Якщо вам потрібен фактичний тип, до якого ви можете передати або перевірити тип, як у вашому прикладі сценарію ... це неможливо зробити, не написавши його на C # або VB.net і не скомпілювавши. У PowerShell 2 ви можете скористатися командою "Додати тип", щоб зробити це досить просто:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Історична примітка : у PowerShell 1 це було ще складніше. Вам довелося вручну використовувати CodeDom, на PoshCode.org є дуже стара функція new-struct script, яка допоможе. Вашим прикладом стає:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Використання Add-Type
або New-Struct
дозволить вам фактично перевірити клас у вашому param([Contact]$contact)
і створити нові за допомогою $contact = new-object Contact
тощо ...
У PowerShell 3
Якщо вам не потрібен "справжній" клас, до якого ви можете перейти, вам не доведеться використовувати спосіб Add-Member, який продемонстрували Стівен та інші .
З 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"
}