Há algumas respostas boas aqui, mas eu queria apontar algumas outras coisas. Os parâmetros de função são, na verdade, um local onde o PowerShell brilha. Por exemplo, você pode ter parâmetros nomeados ou posicionais em funções avançadas como:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Em seguida, você pode chamá-lo especificando o nome do parâmetro ou apenas usar parâmetros posicionais, já que os definiu explicitamente. Então, qualquer um destes funcionaria:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
O primeiro exemplo funciona, embora Name
seja fornecido em segundo lugar, porque usamos explicitamente o nome do parâmetro. O segundo exemplo funciona com base na posição, portanto, Name
seria necessário primeiro. Sempre que possível, tento sempre definir posições para que ambas as opções estejam disponíveis.
O PowerShell também tem a capacidade de definir conjuntos de parâmetros. Ele usa isso no lugar da sobrecarga do método e, novamente, é 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
)
}
Agora, a função terá um nome ou um ID, mas não os dois. Você pode usá-los posicionalmente ou pelo nome. Como eles são de um tipo diferente, o PowerShell descobrirá isso. Então, tudo isso funcionaria:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
Você também pode atribuir parâmetros adicionais aos vários conjuntos de parâmetros. (Esse foi um exemplo bastante básico, obviamente.) Dentro da função, você pode determinar qual conjunto de parâmetros foi usado com a propriedade $ PsCmdlet.ParameterSetName. Por exemplo:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Em uma nota lateral relacionada, também há validação de parâmetro no PowerShell. Esse é um dos meus recursos favoritos do PowerShell e torna o código dentro de suas funções muito limpo. Existem inúmeras validações que você pode usar. Alguns exemplos são:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
No primeiro exemplo, ValidatePattern aceita uma expressão regular que garante que o parâmetro fornecido corresponda ao que você está esperando. Caso contrário, é lançada uma exceção intuitiva, informando exatamente o que está errado. Portanto, nesse exemplo, 'Something' funcionaria bem, mas 'Summer' não passaria na validação.
ValidateRange garante que o valor do parâmetro esteja no intervalo esperado para um número inteiro. Portanto, 10 ou 99 funcionariam, mas 101 lançaria uma exceção.
Outro útil é o ValidateSet, que permite definir explicitamente uma matriz de valores aceitáveis. Se algo mais for inserido, uma exceção será lançada. Também existem outros, mas provavelmente o mais útil é o ValidateScript. Isso requer um bloco de script que deve ser avaliado como $ true, para que o céu seja o limite. Por exemplo:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
Neste exemplo, temos a certeza não apenas de que $ Path existe, mas também de um arquivo (em oposição a um diretório) e de uma extensão .csv. ($ _ refere-se ao parâmetro, quando dentro do seu bloco de script.) Você também pode passar blocos de script com várias linhas muito maiores, se esse nível for necessário, ou usar vários blocos de script como eu fiz aqui. É extremamente útil e contribui para boas funções limpas e exceções intuitivas.
Test "ABC" "DEF"