Las funciones permiten agrupar comandos con un propósito y ejecutarlo desde cualquier parte de nuestro programa invocándola por su nombre, evitamos repetir los mismos comandos una y otra vez cuando queremos repetir una operación. Encapsulando la lógica de la aplicación en una función además fomenta la reutilización del código en otros scripts y la legibilidad para entender su funcionamiento.
Para crear una función comenzamos con la palabra clave Function
para declararla seguida del nombre de la función que queramos darle, como buena práctica los manuales recomiendan usar una combinación de verbo-nombre, podemos incluso obtener una lista estándar de verbos que usa PS.
Get-Command -CommandType cmdlet | Group-Object -Property Verb | Sort-Object -Property count -Descending
Función básica
Fuente: Write-HolaMundo.ps1
El siguiente ejemplo ilustra una función super sencilla, cada vez que invocamos a la función por su nombre (una función debe "llamarse" para que ejecute sus comandos) ejecuta las líneas de comandos encerradas entre las llaves { }
.
Function Write-HolaMundo
{
"Hola"
"Mundo"
}
Write-HolaMundo
# Podemos invocar la función por su nombre tantas veces queramos.
Write-HolaMundo
Función para obtener la versión del sistema operativo
Fuente: Get-OperatingSystemVersion.ps1
La siguiente función muestra como usar la salida que genera la función con la versión del sistema operativo para imprimir una cadena de texto. Usamos el cmdlet Get-WmiObject para obtener una instancia de la clase Win32_OperatingSystem y acceder a su propiedad Version.
Function Get-OperatingSystemVersion
{
(Get-WmiObject -Class Win32_OperatingSystem).Version
} #end Get-OperatingSystemVersion
"This OS is version $(Get-OperatingSystemVersion)"
Función con parámetros: Crear un directorio
Fuente: New-Directory.ps1
La siguiente función crea un directorio llamado "MyNewDir":
function New-Directory
{
New-Item -ItemType Directory -Name "MyNewDir"
} #end New-Directory
New-Directory
Si realmente quisieramos que su funcionalidad fuese más genérica cobra sentido poder pasarle el nombre del directorio que queremos crear para crear directorios diferentes, los parámetros permiten definir variables que alteran el comportamiento de la función pasandole valores desde su llamada.
function New-Directory-Ext($dirName)
{
New-Item -ItemType Directory -Name $dirName
} #end New-Directory-Ext
New-Directory-Ext "MyDir1"
New-Directory-Ext "MyDir2"
Parámetros con tipo
Fuente: Get-Sum.ps1
Podemos restringir el tipo de dato que acepta una parámetro de una función, si por ejemplo queremos recibir dos enteros como parámetros para realizar una suma usamos [int]
:
function Get-Sum([int] $n1,[int] $n2)
{
$n1+$n2
} #end Get-Sum
"Suma de números: $(Get-Sum 3 5)"
# Esta llamada produciría un error
# "Suma de números:"+ $(Get-Sum "Tres" 5)
Otros tipos usados de forma común son [String]
, [double]
o [DateTime]
.
Retornar datos de una función
Como hemos visto más arriba para retornar datos de la función simplemente podemos escribir los datos de salida.
Fuente: Get-SysDate.ps1
function Get-SysDate {
Get-Date
} #end Get-SysDate
$tomorrow = (Get-SysDate).AddDays(1)
$tomorrow
El cmdlet Get-Date genera la salida que capturamos desde donde invoca la función.
Si queremos ser más explicitos sobre el dato retornado PS continua soportando la palabra clave return
.
Fuente: Get-Average.ps1
function Get-Average {
param([int] $a, [int] $b)
return ($a+$b)/2
} #end Get-Average
"Media de números: $(Get-Average 3 5)"
Valores por defecto para los parámetros
Fuente: Get-Greeting.ps1
Podemos definir valores por defecto para los parámetros, este es un ejemplo muy sencillo.
function Get-Greeting {
param([string] $subject="World")
Write-Host "Hello $subject"
} #end Get-Greeting
Get-Greeting
Get-Greeting "Mundo"
Retornando una colección (ArrayList)
Fuente: Get-ArrayList.ps1