Aquí hay algunas buenas respuestas, pero quería señalar un par de otras cosas. Los parámetros de función son en realidad un lugar donde brilla PowerShell. Por ejemplo, puede tener parámetros con nombre o posicionales en funciones avanzadas de esta manera:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Luego, podría llamarlo especificando el nombre del parámetro, o simplemente podría usar parámetros posicionales, ya que los definió explícitamente. Entonces, cualquiera de estos funcionaría:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
El primer ejemplo funciona aunque Name
se proporciona el segundo, porque explícitamente usamos el nombre del parámetro. Sin embargo, el segundo ejemplo funciona según la posición, por Name
lo que debería ser el primero. Cuando es posible, siempre trato de definir posiciones para que ambas opciones estén disponibles.
PowerShell también tiene la capacidad de definir conjuntos de parámetros. Utiliza esto en lugar de la sobrecarga de métodos, y de nuevo es bastante útil:
function Get-Something
{
[CmdletBinding(DefaultParameterSetName='Name')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
[string] $Name,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
[int] $Id
)
}
Ahora la función tomará un nombre o una identificación, pero no ambos. Puede usarlos posicionalmente o por nombre. Como son de un tipo diferente, PowerShell lo resolverá. Entonces, todo esto funcionaría:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
También puede asignar parámetros adicionales a los distintos conjuntos de parámetros. (Ese fue un ejemplo bastante básico, obviamente). Dentro de la función, puede determinar qué conjunto de parámetros se usó con la propiedad $ PsCmdlet.ParameterSetName. Por ejemplo:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Luego, en una nota al margen relacionada, también hay validación de parámetros en PowerShell. Esta es una de mis características favoritas de PowerShell, y hace que el código dentro de sus funciones sea muy limpio. Existen numerosas validaciones que puede usar. Un par de ejemplos son:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
En el primer ejemplo, ValidatePattern acepta una expresión regular que garantiza que el parámetro proporcionado coincida con lo que espera. Si no es así, se produce una excepción intuitiva que le dice exactamente qué está mal. Entonces, en ese ejemplo, 'Something' funcionaría bien, pero 'Summer' no pasaría la validación.
ValidateRange garantiza que el valor del parámetro se encuentre entre el rango que espera para un entero. Entonces 10 o 99 funcionarían, pero 101 arrojaría una excepción.
Otro útil es ValidateSet, que le permite definir explícitamente una matriz de valores aceptables. Si se ingresa algo más, se lanzará una excepción. También hay otros, pero probablemente el más útil es ValidateScript. Esto toma un bloque de script que debe evaluar a $ true, por lo que el cielo es el límite. Por ejemplo:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
En este ejemplo, estamos seguros de que no solo existe $ Path, sino que es un archivo (a diferencia de un directorio) y tiene una extensión .csv. ($ _ se refiere al parámetro, cuando está dentro de su bloque de secuencia de comandos). También puede pasar bloques de secuencia de comandos de varias líneas mucho más grandes si se requiere ese nivel, o usar bloques de secuencia de comandos múltiples como hice aquí. Es extremadamente útil y ofrece buenas funciones de limpieza y excepciones intuitivas.
Test "ABC" "DEF"