До 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 , который поможет. Ваш пример становится:
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
, чтобы убедиться, что каждый объект получается одинаковым, но теперь вы можете легко проверить параметр "is" одного из этих типов, декорируя параметр с атрибутом 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
{
# Optionally, add attributes to prevent invalid values
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
# optionally, have a constructor to
# force properties to be set:
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Мы также получили новый способ создания объектов без использования New-Object
: [Contact]::new()
- фактически, если вы сохранили свой класс простым и не определяете конструктор, вы можете создавать объекты путем приведения хеш-таблицы (хотя без конструктора невозможно было бы принудительно установить, что все свойства должны быть установлены):
class Contact
{
# Optionally, add attributes to prevent invalid values
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}