До PowerShell 3
Расширяемая система типов 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, на 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"
}