Antes do PowerShell 3
O Extensible Type System do PowerShell originalmente não permitia que você criasse tipos concretos que você pudesse testar da maneira como fez em seu parâmetro. Se você não precisa desse teste, está satisfeito com qualquer um dos outros métodos mencionados acima.
Se você quiser um tipo real para o qual possa lançar ou verificar o tipo, como em seu script de exemplo ... não pode ser feito sem escrever em C # ou VB.net e compilar. No PowerShell 2, você pode usar o comando "Add-Type" para fazer isso de forma bastante simples:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Nota histórica : No PowerShell 1 era ainda mais difícil. Você tinha que usar o CodeDom manualmente, há umscript de nova estrutura de função muito antigoem PoshCode.org que ajudará. Seu exemplo se torna:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Usar Add-Typeou New-Structpermitirá que você realmente teste a classe em seu param([Contact]$contact)e faça novas usando $contact = new-object Contacte assim por diante ...
No PowerShell 3
Se você não precisa de uma classe "real" para a qual possa lançar, você não precisa usar o método Add-Member que Steven e outros demonstraram acima.
Desde o PowerShell 2, você pode usar o parâmetro -Property para New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
E no PowerShell 3, conseguimos usar o PSCustomObjectacelerador para adicionar um TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Você ainda está recebendo apenas um único objeto, então deve criar uma New-Contactfunção para garantir que todos os objetos sejam iguais, mas agora você pode facilmente verificar se um parâmetro "é" um desses tipos decorando um parâmetro com o PSTypeNameatributo:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
No PowerShell 5
No PowerShell 5 tudo muda e finalmente obtivemos classe enumcomo palavras-chave de linguagem para definir tipos (não há, structmas está tudo bem):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Também temos uma nova maneira de criar objetos sem usar New-Object: [Contact]::new()- na verdade, se você mantiver sua classe simples e não definir um construtor, você pode criar objetos lançando uma tabela de hash (embora sem um construtor, não haveria maneira para fazer com que todas as propriedades sejam definidas):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}