Antes de PowerShell 3
El sistema de tipo extensible de PowerShell no le permitió originalmente crear tipos concretos que pueda probar de la forma en que lo hizo en su parámetro. Si no necesita esa prueba, está bien con cualquiera de los otros métodos mencionados anteriormente.
Si desea un tipo real al que pueda enviar o verificar el tipo, como en su script de ejemplo ... no se puede hacer sin escribirlo en C # o VB.net y compilarlo. En PowerShell 2, puede usar el comando "Agregar tipo" para hacerlo de manera bastante simple:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Nota histórica : en PowerShell 1 fue aún más difícil. Tenía que usar CodeDom manualmente, hay una función muy antigua de script new-struct en PoshCode.org que ayudará. Tu ejemplo se convierte en:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Usar Add-Type
o New-Struct
te permitirá probar la clase en tu param([Contact]$contact)
y crear nuevas usando $contact = new-object Contact
y así sucesivamente ...
En PowerShell 3
Si no necesitas una clase "real" a la que puedas enviar contenido, no tienes que usar la forma de Agregar miembro que Steven y otros han demostrado anteriormente.
Desde PowerShell 2, puede usar el parámetro -Property para New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
Y en PowerShell 3, tenemos la capacidad de usar el PSCustomObject
acelerador para agregar un TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Todavía está obteniendo un único objeto, por lo que debe crear una New-Contact
función para asegurarse de que todos los objetos salgan igual, pero ahora puede verificar fácilmente que un parámetro "es" uno de esos tipos decorando un parámetro con el PSTypeName
atributo:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
En PowerShell 5
En PowerShell 5 todo cambia, y finalmente obtuvimos class
y enum
como palabras clave de idioma para definir tipos (no hay, struct
pero está bien):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
También obtuvimos una nueva forma de crear objetos sin usar New-Object
: [Contact]::new()
- de hecho, si mantienes tu clase simple y no defines un constructor, puedes crear objetos lanzando una tabla hash (aunque sin un constructor, no habría forma para hacer cumplir que todas las propiedades deben establecerse):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}