Las funciones son comunes en PowerShell y, para comprender realmente el lenguaje de PowerShell, es importante que sepa cómo funcionan las funciones. En este artículo, vamos a mostrar cómo evoluciona una función de PowerShell desde básicamente nada hasta tener parámetros que usan atributos de validación.
Para demostrar esto, comencemos primero con una función que no puede ser más simple.
function Write-Log {
param()
}
Cuando se ejecuta dentro de una sesión de PowerShell, esta función se ejecutará pero no hará nada porque no hay código que ejecutar. PowerShell simplemente ejecuta la función y la devuelve.
Para que la función realmente haga algo, necesitamos agregar algún código. El código se añade entre el bloque param y el último corsé rizado. Puedes ver a continuación que estoy haciendo que mi función de Registro de escritura devuelva la cadena «Hice algo» a la consola.
function Write-Log {
param()
'I did something'
}
PS> Write-Log
I did something
Nuestra función se llama Write-Log, por lo que asumo que esta será una función que eventualmente escribirá algún tipo de texto en un archivo de registro. Debido a que no queremos escribir lo mismo en un archivo de registro cada vez, necesitamos proporcionar alguna forma de cambiar el mensaje cuando se ejecuta la función. Para hacer eso, agregaremos un parámetro. Los parámetros permiten al usuario pasar diferentes valores a la función en tiempo de ejecución. Esto permite que la función recopile entrada dinámica en tiempo de ejecución.
Para agregar un parámetro, agregaré una variable. En este caso, la variable se llama Mensaje. Lo agregaré dentro del bloque param como se muestra a continuación. A continuación, puede ver que puedo hacer referencia a ese parámetro dentro de la función en sí. Cuando se ejecuta, la función devolverá cualquier valor que pase al parámetro Message.
function Write-Log {
param($Message)
$Message
}
PS> Write-Log -Message 'I did something'
I did something
No tiene que detenerse en un solo parámetro. Podemos agregar tantos como queramos aquí. A continuación, añado un parámetro de gravedad, que proporciona un valor cuando se ejecuta la función y puede ver que exhibe el mismo comportamiento.
function Write-Log {
param($Message, $Severity)
"$Message - Severity: $Severity"
}
Write-Log -Message 'I did something' -Severity 1
Ahora que sabemos cómo manejar los parámetros, podemos entrar a los tipos de parámetros. Un parámetro tiene un tipo como cualquier otro en PowerShell. Arriba, estaba usando un tipo pero aceptaba cualquier tipo de objeto imaginable. El parámetro no fue escrito explícitamente. Es una buena práctica hacer esto en todos los parámetros para garantizar que solo se pasen los valores que espera.
Para definir un tipo, podemos agregar el tipo entre corchetes justo antes de que se declare el parámetro.
function Write-Log {
param($Message)
$Message
}
Una vez que se asigna un tipo explícito al parámetro, PowerShell solo aceptará entrada de ese tipo o de un objeto que pueda convertir. En este ejemplo a continuación, estoy pasando el valor booleano false false al parámetro Message. Puede ver que PowerShell no lo permite. Esto se debe a que no puede convertir un tipo booleano a un tipo ServiceController.
Sin embargo, si pasamos un objeto ServiceController que devuelve Get-Service, funciona bien.
PS> Write-Log -Message $service
Status Name DisplayName
------ ---- -----------
Stopped AdtAgent Microsoft Monitoring Agent Audit Fo...
También podemos usar atributos de parámetros. Los atributos de parámetro nos permiten definir diferentes características de cada parámetro que determinan cómo funciona. En el siguiente ejemplo, estoy usando el parámetro Obligatorio. Estos atributos obligan al usuario a pasar un valor al parámetro de mensaje, de lo contrario la función no se ejecutará.
También estoy estableciendo un valor predeterminado en el parámetro de gravedad. Esto me permite forzar que la gravedad sea siempre 1 a menos que se anule en tiempo de ejecución pasando un valor a ese parámetro.
function Write-Log {
param(
$Message,
$Severity = 1
)
"$Message - Severity: $Severity"
}
Finalmente, podemos usar atributos de validación de parámetros. Los atributos de validación de parámetros son una excelente manera de restringir los valores que se pasan a un parámetro. En el siguiente ejemplo, estoy usando el atributo de validación ValidateRange (). Este atributo se utiliza en parámetros de tipo entero para definir un rango de números permitidos. En este ejemplo, solo estoy permitiendo que los valores de gravedad sean 1-5. Cualquier otro valor que no esté en ese rango fallará.
function Write-Log {
param(
$Message,
$Severity
)
"$Message - Severity: $Severity"
}
Wrap Up
Ya debería tener un conocimiento básico de cómo funcionan las funciones en PowerShell. Hemos cubierto todo lo que necesita saber para comenzar a crear funciones útiles en PowerShell. Le animo a que comience a notar los momentos en sus scripts en los que una función sería útil y comience a construirlos. Con el tiempo, verá que su código se volverá más limpio y mucho más fácil de leer.