Przed PowerShell 3
Rozszerzalny system typów programu PowerShell pierwotnie nie pozwalał na tworzenie konkretnych typów, które można przetestować w stosunku do sposobu, w jaki zrobiłeś to w parametrze. Jeśli nie potrzebujesz tego testu, możesz zastosować dowolną z innych metod wymienionych powyżej.
Jeśli chcesz mieć rzeczywisty typ, do którego możesz rzutować lub sprawdzać typy, jak w przykładowym skrypcie ... nie można tego zrobić bez napisania go w C # lub VB.net i skompilowania. W PowerShell 2 możesz użyć polecenia „Add-Type”, aby zrobić to całkiem prosto:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Uwaga historyczna : w PowerShell 1 było jeszcze trudniej. Trzeba było ręcznie użyć CodeDom, na PoshCode.org jest bardzo staryskryptfunkcji nowej struktury, który pomoże. Twój przykład to:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Używanie Add-Type
lub New-Struct
pozwoli ci faktycznie przetestować klasę w twojej param([Contact]$contact)
i stworzyć nowe za pomocą $contact = new-object Contact
i tak dalej ...
W programie PowerShell 3
Jeśli nie potrzebujesz „prawdziwej” klasy, na którą możesz rzucić, nie musisz używać metody Add-Member, którą przedstawili powyżej Steven i inni .
Od PowerShell 2 można użyć parametru -Property dla New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
W PowerShell 3 mamy możliwość użycia PSCustomObject
akceleratora do dodania TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Nadal otrzymujesz tylko jeden obiekt, więc powinieneś utworzyć New-Contact
funkcję, aby upewnić się, że każdy obiekt wychodzi tak samo, ale teraz możesz łatwo sprawdzić, czy parametr „jest” jednym z tych typów, dekorując parametr PSTypeName
atrybutem:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
W programie PowerShell 5
W PowerShell 5 wszystko się zmienia i w końcu otrzymaliśmy class
i enum
jako słowa kluczowe języka do definiowania typów (nie ma, struct
ale to jest w porządku):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Mamy również nowy sposób tworzenia obiektów bez użycia New-Object
: [Contact]::new()
- tak naprawdę, gdybyś utrzymywał prostą klasę i nie definiował konstruktora, możesz tworzyć obiekty, rzucając tablicę haszy (chociaż bez konstruktora nie byłoby sposobu aby wymusić, że wszystkie właściwości muszą być ustawione):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}