Atributos de parâmetros avançados
Esta aula aborda os atributos de parâmetros avançados em funções do PowerShell, incluindo o uso de [Parameter(Mandatory)], Parameter Sets, Switch parameters e Aliases. Você aprenderá a definir parâmetros obrigatórios, criar conjuntos de parâmetros mutuamente exclusivos, usar switches booleanos e criar apelidos para parâmetros.
Em funções avançadas do PowerShell, os parâmetros podem ser decorados com atributos que controlam seu comportamento. O atributo [Parameter()] é o principal mecanismo para definir propriedades como obrigatoriedade, posição, valor padrão e agrupamento em conjuntos. Nesta aula, exploraremos quatro aspectos essenciais: parâmetros obrigatórios (Mandatory), conjuntos de parâmetros (Parameter Sets), parâmetros do tipo switch e aliases (apelidos).
Compreender esses conceitos é fundamental para criar funções robustas e intuitivas, que se comportam de forma previsível e são fáceis de usar tanto na linha de comando quanto em scripts.
[Parameter(Mandatory)]
O atributo [Parameter(Mandatory = $true)] torna um parâmetro obrigatório. Se o usuário não fornecer um valor para esse parâmetro, o PowerShell solicitará o valor interativamente (a menos que o pipeline esteja sendo usado para fornecer o valor).
Exemplo de função com parâmetro obrigatório:
function Get-UserInfo {
param(
[Parameter(Mandatory = $true)]
[string]$UserName
)
Write-Host "Obtendo informações para o usuário: $UserName"
}Se você chamar Get-UserInfo sem o parâmetro -UserName, o PowerShell exibirá uma solicitação para digitar o valor. Para evitar a solicitação, você pode fornecer o valor via pipeline ou usar o parâmetro -ErrorAction Stop para gerar um erro.
Parameter Sets
Parameter Sets (conjuntos de parâmetros) permitem que uma função tenha diferentes combinações de parâmetros que são mutuamente exclusivas. Cada conjunto é identificado por um nome e pode conter parâmetros opcionais ou obrigatórios. O PowerShell seleciona automaticamente o conjunto correto com base nos parâmetros fornecidos.
Sintaxe básica:
function Set-Config {
param(
[Parameter(ParameterSetName = 'Path', Mandatory = $true)]
[string]$ConfigPath,
[Parameter(ParameterSetName = 'Name', Mandatory = $true)]
[string]$ConfigName,
[Parameter(ParameterSetName = 'Path')]
[Parameter(ParameterSetName = 'Name')]
[switch]$Force
)
if ($PSCmdlet.ParameterSetName -eq 'Path') {
Write-Host "Usando caminho: $ConfigPath"
} else {
Write-Host "Usando nome: $ConfigName"
}
}Exemplo de uso: Set-Config -ConfigPath "C:\config.ini" ou Set-Config -ConfigName "default". Não é possível usar ambos simultaneamente. O parâmetro -Force está disponível em ambos os conjuntos.
Switch Parameters
Parâmetros do tipo [switch] são usados para representar flags booleanas. Eles não aceitam um valor; sua presença indica $true e ausência indica $false. São ideais para ativar/desativar comportamentos.
Exemplo:
function Invoke-Task {
param(
[switch]$Verbose
)
if ($Verbose) {
Write-Host "Executando com detalhes..."
}
# resto da lógica
}Uso: Invoke-Task -Verbose ativa a saída detalhada. Sem a chave, a condição é falsa. Parâmetros switch também podem ser usados em parameter sets para diferenciar comportamentos.
Aliases
Aliases (apelidos) para parâmetros permitem que o usuário use nomes mais curtos ou alternativos. Eles são definidos com o atributo [Alias()] dentro do bloco param().
Exemplo:
function Remove-ItemSafely {
param(
[Parameter(Mandatory = $true)]
[Alias('Path', 'FullName')]
[string]$ItemPath
)
Write-Host "Removendo $ItemPath"
}O parâmetro -ItemPath pode ser chamado como -Path ou -FullName. Múltiplos aliases são separados por vírgula. Aliases são úteis para compatibilidade com nomes de cmdlets existentes ou para abreviações.
Boas Práticas
- Sempre documente os parâmetros com comentários baseados em ajuda (
.PARAMETER) para melhorar a experiência do usuário. - Use nomes de parâmetros descritivos e consistentes com os padrões do PowerShell (substantivo-verbo).
- Evite criar muitos parameter sets; prefira funções separadas se a lógica for muito diferente.
- Para switches, evite usar
$trueou$falsecomo valor; simplesmente presença/ausência é suficiente. - Aliases devem ser curtos e intuitivos, mas não substituem a documentação adequada.
Referências
- About Functions Advanced Parameters
- About Parameter Sets
- About Switch
- About Aliases
- Strongly Encouraged Development Guidelines
Exercícios
Crie uma função chamada
New-Userque tenha um parâmetro obrigatório-UserNamedo tipo string. Teste chamar a função sem o parâmetro e veja o que acontece.✓ Resposta:function New-User { param( [Parameter(Mandatory = $true)] [string]$UserName ) Write-Host "Criando usuário: $UserName" }Ao chamar
New-Usersem argumentos, o PowerShell solicitará o valor deUserName.Modifique a função
New-Userpara incluir um parameter set chamado 'WithEmail' que exija um parâmetro-Emaile outro conjunto chamado 'WithoutEmail' que não exija email. O parâmetro-UserNamedeve ser comum a ambos.✓ Resposta:function New-User { param( [Parameter(Mandatory = $true)] [string]$UserName, [Parameter(ParameterSetName = 'WithEmail', Mandatory = $true)] [string]$Email ) if ($PSCmdlet.ParameterSetName -eq 'WithEmail') { Write-Host "Criando usuário $UserName com email $Email" } else { Write-Host "Criando usuário $UserName sem email" } }Adicione um parâmetro switch chamado
-Forceà função do exercício anterior, que esteja disponível em ambos os parameter sets.✓ Resposta:function New-User { param( [Parameter(Mandatory = $true)] [string]$UserName, [Parameter(ParameterSetName = 'WithEmail', Mandatory = $true)] [string]$Email, [Parameter(ParameterSetName = 'WithEmail')] [Parameter(ParameterSetName = 'WithoutEmail')] [switch]$Force ) if ($Force) { Write-Host "Forçando criação..." } if ($PSCmdlet.ParameterSetName -eq 'WithEmail') { Write-Host "Criando usuário $UserName com email $Email" } else { Write-Host "Criando usuário $UserName sem email" } }Crie uma função chamada
Get-ProcessInfoque aceite um parâmetro-ProcessNamecom um alias-Name. O parâmetro deve ser obrigatório. Teste chamar a função com-Name.✓ Resposta:function Get-ProcessInfo { param( [Parameter(Mandatory = $true)] [Alias('Name')] [string]$ProcessName ) Get-Process -Name $ProcessName }Chamada:
Get-ProcessInfo -Name "powershell"funciona normalmente.Combine todos os conceitos: crie uma função
Set-Environmentque tenha dois parameter sets: 'Variable' (com parâmetros obrigatórios-Namee-Value) e 'File' (com parâmetro obrigatório-Path). Adicione um switch-Globaldisponível em ambos os sets e um alias-EnvNamepara o parâmetro-Name.✓ Resposta:function Set-Environment { param( [Parameter(ParameterSetName = 'Variable', Mandatory = $true)] [Alias('EnvName')] [string]$Name, [Parameter(ParameterSetName = 'Variable', Mandatory = $true)] [string]$Value, [Parameter(ParameterSetName = 'File', Mandatory = $true)] [string]$Path, [Parameter(ParameterSetName = 'Variable')] [Parameter(ParameterSetName = 'File')] [switch]$Global ) if ($PSCmdlet.ParameterSetName -eq 'Variable') { if ($Global) { [Environment]::SetEnvironmentVariable($Name, $Value, 'Machine') } else { [Environment]::SetEnvironmentVariable($Name, $Value, 'User') } Write-Host "Variável $Name definida como $Value" } else { Write-Host "Carregando ambiente do arquivo: $Path" # Lógica para carregar variáveis do arquivo } }