3 formas distintas de crear objetos en PowerShell

Como ya hemos visto en entradas anteriores, cuando trabajamos con PowerShell acostumbramos a pasarnos todo el tiempo manipulando objetos, ya sea consultándolos, modificándolos, creándolos o eliminándolos. En la entrada de hoy vamos a ver de qué formas podemos crear objetos en PowerShell, cuál es la más adecuada y por qué deberíamos hacerlo.

3 formas distintas de crear objetos en PowerShell

Antes de nada: ¿por qué es importante crear objetos en PowerShell?

Como decía en la introducción y como ya he dicho en más de una ocasión en este blog, en PowerShell todo es un objeto.

Cuando utilizamos cualquier cmdlet éste va a devolvernos un objeto. Lo potente de ello es que podemos utilizar todo el set de herramientas habituales para procesar dicho objeto, estemos tratando con un objeto que representa un servicio de Windows o con uno que representa una máquina virtual de vSphere indistintamente.

En la medida de lo posible, cuando desarrollemos nuestras propias funciones o scripts deberíamos seguir dicha práctica e intentar devolver objetos en vez de texto. Hacerlo garantiza que cualquier persona que vaya a ejecutar dicha herramienta pueda manipular la salida de la misma de la forma que está acostumbrada con cualquier otro cmdlet de PowerShell.

Ahora que ya conocemos los beneficios de devolver objetos en nuestras funciones y scripts pasemos a la acción y empecemos a ver cómo crearlos.

Método 1: Crear objetos en PowerShell con New-Object y Add-Member

La primera forma que vamos a utilizar para crear objetos en PowerShell será utilizando New-Object y Add-Member. New-Object nos permitirá crear el objeto y con Add-Member le podremos añadir propiedades y métodos.

# Creamos el objeto
$ObjetoSobrebits = New-Object -TypeName PSCustomObject

# Le añadimos las propiedades
$ObjetoSobrebits | Add-Member -MemberType NoteProperty -Name Nombre -Value "Sobrebits"
$ObjetoSobrebits | Add-Member -MemberType NoteProperty -Name URL -Value "https://sobrebits.com"
$ObjetoSobrebits | Add-Member -MemberType NoteProperty -Name Autor -Value "Marc Meseguer"

Si ahora examinamos el contenido de nuestro objeto $ObjetoSobrebits veremos lo siguiente:

Objeto creado con New-Object

Como podemos observar New-Object ha creado un nuevo objeto del tipo PSCustomObject y Add-Member ha añadido nuestras propiedades. Como decía al principio con Add-Member también podemos añadir métodos a nuestro objeto:

$ObjetoSobrebits | Add-Member -MemberType ScriptMethod -Name Status -Value {(Invoke-WebRequest https://sobrebits.com).StatusDescription}

Si ahora invocamos al método Status de nuestro objeto nos devolverá, en este caso, el estado de la transacción web a sobrebits.com:

Método en objeto creado con New-Object

Método 2: Utilizando New-Object y una hashtable

Después de ver el primer método la sensación que se nos puede quedar es que para crear un objeto hay que picar mucho código. Nada más lejos de la realidad, con este método vamos a intentar disminuir la cantidad de código a escribir con el uso de una hashtable (o diccionario en otros lenguajes de programación):

# Creamos las propiedades del objeto
$Propiedades = [ordered]@{
    Nombre = "Sobrebits"
    URL = "https://sobrebits.com"
    Autor = "Marc Meseguer"
}

# Creamos el objeto con las propiedades creadas anteriormente
$ObjetoSobrebits2 = New-Object -TypeName PSCustomObject -Property $Propiedades

Veamos qué hemos hecho:

  • Líneas 2-6: Creamos una hashtable con las propiedades que daremos al objeto y la almacenamos en $Propiedades.
    • En la creación utilizamos [ordered] para que se conserve el orden en el que definimos los valores de la hashtable. De no hacerlo aparecerían desordenados.
  • Línea 9: Creamos el objeto utilizando las propiedades definidas en la hashtable.
Objeto de PowerShell creado con hashtable

Como podemos comprobar tenemos el mismo objeto que en el primer método pero generado de una forma mucho más rápida al ahorrarnos todos los Add-Member.

Método 3: Utilizando una Hashtable y un acelerador de tipo

Si bien el método 2 supone un gran ahorro a la hora de crear nuestros objetos, éste método viene para hacerlo todo aún más minimalista. Para ahorrarnos la creación del objeto con New-Object utilizaremos el acelerador de tipo [pscustomobject] delante de la definición de la hashtable. Con ello tendremos el objeto creado con un solo paso.

$ObjetoSobrebits3 = [pscustomobject]@{
    Nombre = "Sobrebits"
    URL = "https://sobrebits.com"
    Autor = "Marc Meseguer"
}

Si miramos el contenido de nuestra variable veremos que nada ha cambiado respecto a los métodos anteriores más allá de la reducción del código utilizado:

Objeto creado mediante hashtable y acelerador de tipo

Nota: Utilizando el acelerador de tipo [pscustomobject] ya incluye el uso de [ordered] en la hashtable que hemos visto en el método anterior.

Conclusión

Como he dicho al principio de la entrada es muy importante que utilicemos siempre que sea posible objetos como salida de nuestros scripts y funciones.

Espero que estos tres métodos os sean útiles. Si bien hay más éstos son los más utilizados. Yo particularmente utilizo el 3 siempre que puedeo desde que lo descubrí, todo lo que sea ahorrar en líneas es bienvenido en mi código. 🙂

¡Hasta la próxima!

Deja un comentario