PowerShell es un lenguaje orientado a objetos. Cuando ejecutas comandos, ves la salida en tu pantalla, esos son objetos. Los objetos no surgen de la nada; los desarrolladores los crean o, más específicamente, los instancian con clases. Las clases en PowerShell representan definiciones o esquemas de esos objetos.
Aunque puedas estar familiarizado con la creación de objetos mediante comandos como New-Object
y el uso del acelerador de tipo pscustomobject
, estos no son objetos “nuevos”. Los tipos de objetos que producen estos métodos son de un tipo específico. Las clases en PowerShell definen el tipo.
En este tutorial, aprenderás cómo empezar con las clases en PowerShell. Crearás tu primera clase con constructores, aprenderás cómo crear objetos a partir de tu clase y personalizarás tu clase con propiedades y métodos.
Para obtener información sobre términos como objetos, propiedades y métodos, consulta la publicación del blog Volver a lo Básico: Comprendiendo los Objetos en PowerShell.
Prerrequisitos
Creación de Tu Primera Clase y Objeto
Antes de poder comprender a fondo una clase en PowerShell, primero debes recorrer la creación de una clase simple. Los temas más avanzados los aprenderás más adelante.
Creando tu primera clase se sentirá un poco como crear una función. La sintaxis básica es la misma. Se crea una clase a partir de una definición como una función. A diferencia de las funciones, sin embargo, la primera línea no comienza con function
seguido del nombre de la función, sino que comienza con class
seguido del nombre de tu tipo de objeto.
A continuación, verás el esqueleto básico de una clase llamada student.
Las clases tienen propiedades que se parecen a parámetros y son atributos que describen esa clase. El ejemplo a continuación muestra una clase llamada student con dos propiedades; FirstName
y LastName
.
Cuando defines una propiedad, siempre debes definir un tipo que establezca un “esquema” específico para lo que los valores de propiedad pueden contener. En el ejemplo a continuación, ambas propiedades están definidas como cadenas.
Siempre deberías definir los tipos de propiedad. Verás por qué más tarde.
Después de definir una clase, crea un objeto a partir de ella o instancia un objeto. Hay múltiples formas de instanciar objetos a partir de clases; una forma común es usar aceleradores de tipo como [student]
que representan la clase, seguido de un método predeterminado que viene con cada clase llamado new()
.
Usar el atajo de acelerador de tipo es lo mismo que crear un objeto usando el comando New-Object
.
Una vez que hayas creado un objeto de esa clase, asigna valores a las propiedades. El ejemplo a continuación asigna valores de Tyler
y Muir
a las propiedades FirstName
y LastName
.
Una vez que hayas creado el objeto y asignado valores a las propiedades, inspecciona el objeto llamando a la variable a la que asignaste el objeto, como se muestra a continuación.

Ahora que has creado un objeto a partir de una clase, canaliza ese objeto como cualquier otro objeto en PowerShell al cmdlet Get-Member
para inspeccionarlo. Puedes ver a continuación que el objeto contenido en la variable $student1
es del tipo student.
El nombre de la clase siempre se correlacionará con el tipo de objeto.
Observa que Get-Member
devuelve cuatro métodos y dos propiedades. Las propiedades probablemente te resulten familiares, pero los métodos seguramente no. PowerShell agrega ciertos métodos por defecto, pero puedes agregar tus propios métodos o incluso modificar los métodos predeterminados.

Creación de Métodos
En el ejemplo anterior, viste algunos métodos predeterminados en el objeto, pero lo más probable es que desees crear los tuyos. Para hacerlo, debes definir uno o más métodos dentro de la definición de la clase.
A method definition looks like below with an output type that defines what type of object is returned from this method, the name of the method, and the code to execute inside of a scriptblock.
Observa los paréntesis ()
después del nombre. Aquí es donde puedes definir los parámetros del método (se explican más adelante). Los parámetros del método te permiten cambiar la funcionalidad de un método de la misma manera que puedes hacerlo con los parámetros de una función.
Si has escrito y ejecutado funciones de PowerShell antes, los bloques de script de método deberían resultarte familiares, pero hay un par de reglas especiales para los métodos que deberías conocer.
return
es Obligatorio
Las funciones de PowerShell devolverán objetos simplemente colocando el objeto en cualquier lugar de la función como en el siguiente ejemplo.
Sin embargo, a diferencia de las funciones, si un método devuelve un objeto, debes usar la construcción return
como se muestra a continuación.
Uso de la Variable $this
Otra diferencia que tienen los métodos con las funciones es la variable $this
. La variable $this
, como se define dentro de un método, hace referencia a las propiedades o otros métodos del objeto actual.
A continuación se muestra un ejemplo de un método llamado GetName()
añadido a la clase student
que concatena el valor de las propiedades FirstName
y LastName
y las devuelve.
Ahora puedes llamar al método GetName()
usando la notación de punto como se muestra a continuación. Si previamente asignaste valores a FirstName
y LastName
, GetName()
los devolverá.

Añadiendo Parámetros a los Métodos
En el ejemplo anterior, cuando ejecutaste la línea $student1.GetName()
, estabas llamando al método GetName()
tal cual. Dentro de los paréntesis, puedes definir parámetros igual que en las funciones.
El método GetName()
simplemente devolvía los valores que se establecieron para las propiedades FirstName
y LastName
. Pero ¿qué pasa si prefieres tener un método para establecer propiedades que luego GetName()
pueda obtener? En ese caso, necesitas definir parámetros del método.
Define los parámetros del método incluyendo uno o más parámetros separados por comas entre paréntesis de parámetro del método, como se muestra a continuación.
Observa el tipo de salida
[void]
. Siempre que un método no produzca ninguna salida, no necesitas un constructoreturn
, y debes definir el tipo de salida como[void]
para indicarle a PowerShell que el método no devuelve nada.
Por ejemplo, tal vez el método SetName()
acepte un nombre completo (nombre y apellido). Si es así, en el bloque de script, puedes dividir esta cadena y asignar el nombre y apellido de esa manera.
Al insertar el método SetName()
en la clase student
, así es como se ve ahora.
Ahora puedes pasar un nombre completo como parámetro al método SetName()
, que establece las propiedades FirstName
y LastName
del objeto actual.

Sobrecarga de métodos
Tal vez te gustaría definir diferentes conjuntos de parámetros para un método. Similar a cómo funcionan los conjuntos de parámetros en funciones y cmdlets, puedes definir diferentes “contextos” de parámetros o firmas de método.
Quizás te gustaría establecer los parámetros FirstName
y LastName
pasando un nombre completo al método SetName()
o pasando el nombre y apellido por separado. No tienes que elegir; puedes definir ambos con las firmas de método.
Cuando defines más de una firma de método en una clase, eso se llama sobrecarga.
Reutilizando el ejemplo de la sección anterior, puedes crear una sobrecarga para el método SetName()
para aceptar dos cadenas en lugar de una. Cuando pasas dos cadenas en lugar de una, el método SetName()
asume que la primera cadena es el FirstName
y la segunda cadena es el LastName
. Con esa sobrecarga, la clase se vería así debajo.

Constructores de Clase
Cada vez que instancias un objeto con el método new()
u otra forma, puedes indicarle a PowerShell que ejecute algún código definido por el usuario llamado constructor. Los constructores son como métodos, pero se ejecutan automáticamente cuando PowerShell instancia un objeto.
Cada clase tiene un constructor predeterminado. Este constructor predeterminado no hace mucho; simplemente se encarga de instanciar el objeto. Puedes ver el constructor predeterminado al ver la salida del método New
. Puedes ver abajo que esta línea devuelve un solo método new()
.

Sobrecarga de Constructores
Quizás desees establecer un valor para las propiedades FirstName
y LastName
tan pronto como creas el objeto, no con la notación de punto típica. En ese caso, puedes crear un constructor con un parámetro que luego llame a SetName()
.
A continuación se muestra un ejemplo de un constructor para la clase student
. Observa que el constructor no tiene un nombre específico ni está precedido por un tipo de salida. Los constructores siempre usan el mismo nombre que la clase.
Llamar a un método existente en el constructor nos permite reutilizar el método que ya escribimos para manejar la configuración de las variables.
Y a continuación verás ese constructor agregado a la clase student
.
Cuando instancias un nuevo objeto student
y pasas un parámetro de cadena, las propiedades del objeto tendrán inmediatamente los valores esperados.

Ahora puedes ver nuevamente el constructor sobrecargado con [student]::New
. Observa que el nuevo constructor sobrecargado se define con un parámetro Name
.

Definición de un Constructor Predeterminado y Sobrecargado
Ahora que tienes un constructor sobrecargado en tu clase student
, PowerShell sobrescribe el constructor predeterminado. Pero puedes recuperarlo creando manualmente uno sin parámetros.
Puedes ver cómo se ve eso en la clase student
a continuación.
Ahora verifica los constructores nuevamente. Ahora verás que ambos constructores aparecen.

Herencia de Clases
Como todos los demás lenguajes orientados a objetos, puedes construir clases en PowerShell de manera jerárquica con múltiples clases. Cada clase puede tener clases “padre” e “hijo” que parten de propósitos menos específicos y más genéricos, aumentando la especificidad.
Por ejemplo, nuestra clase student
representa a un estudiante universitario (hijo/específico). Ese estudiante universitario es una persona (padre/genérico). Estos dos conceptos están relacionados y forman una jerarquía.
A child class can inherit a parent class which means it can hold all properties and methods (members) defined via a parent class. We know that a person
class may have properties like eye_color
, height
, and weight
and perhaps a method called SetHeight()
.
Si un estudiante es una persona, ese estudiante aún tiene esas propiedades y métodos. Sería duplicar esfuerzos implementar esos mismos miembros en la clase student
que la clase person
ya tiene. Puedes definir la herencia de clases para definir automáticamente todos los miembros de la clase person
en la clase student
.
Si esto no tiene sentido ahora, lo tendrá mientras avanzamos a través de una demostración.
Demostración de Herencia de Clases
Primero, haz una copia de la clase student
que creaste anteriormente, elimina los constructores y cámbiale el nombre a una clase person
. Tu clase person
debería parecerse a la siguiente clase.
A student, of course, has a first name and last name, but the class can be described more accurately by labeling it as a person. When creating a more “generic” class like this, you can create more specific “child” classes from it.
Ahora, crea un par de clases que representen a una persona pero tengan un papel más específico. Por ejemplo, en el fragmento de código a continuación, ahora tienes una clase teacher
y student
.
Tal como están, las clases teacher
y student
son mutuamente excluyentes de la clase person
. No tienen ninguna relación, pero no pueden heredar ningún miembro de la clase person
. Cambiemos eso.
Ahora define esa jerarquía al definir la clase teacher
y student
como clases “hijas” de la clase person
con herencia. Puedes definir la herencia agregando dos puntos (:
) después del nombre de la clase seguido del nombre de la clase padre, como se muestra a continuación.
Tu script de clase completo debería lucir así:
En este punto, al instanciar un objeto de la clase teacher
o student
, ambas clases tendrán los mismos miembros que la clase person
.

Herencia con Constructores
Como viste anteriormente, los métodos de clase se heredan mediante la herencia de clase. Este comportamiento puede hacerte pensar que los constructores seguirían esa misma lógica, pero estarías equivocado. Los constructores no se heredan, y los constructores de todas las clases hijas deben definirse en cada clase hija por separado.
Por ejemplo, tal vez acabas de definir un constructor sobrecargado para la clase person
pero no definiste un constructor para la clase teacher
, como se muestra a continuación.
Luego defines una clase hija, teacher
, por ejemplo, e intentas crear un objeto sin parámetros de ella, como se muestra a continuación. Observa que PowerShell devuelve un error porque no se definió un constructor sin parámetros dentro de la clase teacher
.

A constructor is not necessary in a child class if you’re only using it as a template. Alternatively, if you want to use the parent class as its own standalone class and as a parent class you can include constructors. But you have to make sure that the parent class has a constructor that matches the ones in the child classes.
Atributos de Miembro de Clase
Así como los parámetros de comando de PowerShell, las clases pueden tener atributos de miembro. Estos atributos modifican el comportamiento de cada miembro.
Miembros Ocultos
Si estás utilizando un miembro de clase únicamente para propósitos internos y no deseas que el usuario lo lea o escriba, puedes establecer un miembro como oculto. Por ejemplo, tal vez tengas un método que solo es utilizado por otros métodos. No hay necesidad de exponer ese método al usuario.
Para definir un miembro oculto, utiliza el atributo hidden
como se muestra a continuación.
Ahora, cuando uses Get-Member
para inspeccionar todos los miembros del objeto, esa propiedad no aparecerá.

Establecer un miembro de clase como oculto no restringe el acceso al valor; solo lo oculta de la vista. No deberías ocultar propiedades para almacenar datos sensibles.
Miembros Estáticos
Recuerda que en este tutorial se utilizó el término “instanciar” para describir la creación de un objeto a partir de una clase. Cuando instancias un objeto, ese objeto adquiere todas las propiedades y métodos que la clase define. Pero ese no siempre es el caso.
En ocasiones, no necesitas la sobrecarga de instanciar un objeto completo. En cambio, necesitas hacer referencia rápidamente a un único miembro de clase. En ese caso, puedes establecer un miembro de clase como estático.
Al igual que con el atributo hidden
, define un miembro de clase como estático utilizando la palabra clave static
como se muestra a continuación.
A diferencia de los miembros de clase típicos, PowerShell no crea propiedades y métodos a partir de miembros de clase estáticos. Cuando defines un miembro de clase como estático, al igual que con los miembros ocultos, no aparece cuando usas Get-Member
.

Por ejemplo, tal vez quieras asociar nombres de clases universitarias con la clase student
y definir el número máximo de clases universitarias en las que un estudiante puede participar. Para hacerlo, creas un miembro de array Classes
y un miembro MaxClassCount
.
Dado que el usuario rara vez necesita cambiar el miembro MaxClassCount
, decides definirlo como estático.
Finalmente, creas un método AddClass()
para agregar una clase al horario del estudiante, pero solo si es menor que MaxClassCount
.
Ahora, cuando intentas crear un nuevo objeto student
y asignarle demasiadas clases universitarias, PowerShell solo asignará el número máximo, que sería siete.

Puedes cambiar los valores de los miembros estáticos en cualquier momento. Si, por ejemplo, quisieras hacer que el miembro
MaxClassCount
sea 5 en lugar de 7, cambiarías el valor usando[student]::MaxClassCount = 5
. Cambiar el valor no eliminaría retrospectivamente las clases que están por encima del límite en este ejemplo.
Conclusión
Las clases de PowerShell difuminan la línea entre un lenguaje de script y un lenguaje de programación. Las clases son una excelente manera de definir relaciones entre objetos, agregar formas de interactuar y dar formato a objetos que normalmente solo serían posibles escribiendo funciones especializadas.