Windows PowerShell: Definição de parâmetros

Existem formas simples e complexas para definir parâmetros no Windows PowerShell, e ambas as formas têm seus benefícios.

Don Jones

Você muitas vezes vai escrever um script ou uma função que precise aceitar algum tipo de entrada. Isso poderia ser um nome de computador, um caminho de arquivo ou qualquer coisa assim. Você pode dizer que o Windows PowerShell para esperar esses parâmetros, coletá-los na linha de comando e colocar seus valores em variáveis dentro de seu script ou função. Que faz lidar com entrada fácil e eficiente.

Você apenas tem que saber como declarar seus parâmetros. Os meios mais simples de fazer, então, é o bloco de parâmetro:

Param( [string]$computerName, [string]$filePath )

Você não tem que dividir em linhas separadas, como eu fiz. É legal para executá-lo todos juntos em uma única linha. Eu prefiro quebrá-lo para facilitar a leitura, embora. Quando usado nas primeiras linhas do código em um arquivo de script ou dentro de uma função, o Windows PowerShell lê isso e vai mesmo guia-completo parâmetro nomes quando alguém executa o script ou a função. Eu fui cuidadoso ao usar nomes de parâmetro: eles são – ComputerName e – FilePath aqui. Estas são semelhantes aos outros cmdlets do Windows PowerShell usar para esse tipo de informação. Dessa forma, meus parâmetros são consistentes com o que já está no shell.

Se eu colocar isso em um script chamado Get-Something.ps1, eu usaria os parâmetros como este:

./Get-Something –computerName SERVER1 –filePath C:\Whatever

Eu também poderia truncar os nomes de parâmetro. Isso me permite digitar menos caracteres e eles ainda funcionam:

./Get-Something –comp SERVER1 –file C:\Whatever

Eu mesmo poderia omitir os nomes inteiramente. Windows PowerShell aceitará automaticamente e posicionalmente valores. Aqui eu preciso ter cuidado para fornecer valores na mesma ordem em que os parâmetros são listados no meu arquivo:

./Get-Something SERVER1 C:\Whatever

Claro, usando os nomes de parâmetro, o comando torna-se um pouco mais fácil para uma pessoa a descobrir. Então eu recebo o luxo de colocar os parâmetros em qualquer ordem desejada:

./Get-Something –filePath C:\Whatever –computerName SERVER1

O Windows PowerShell fornece também uma maneira mais complexa de declarar parâmetros. Esta sintaxe mais completo permite-lhe definir parâmetros como obrigatória, especificar uma posição (se você não fizer isso, então o parâmetro só pode ser usado pelo nome) e muito mais. Esta sintaxe expandida também é legal em scripts e funções:

[CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$computerName, [Parameter(Mandatory=$True)] [string]$filePath )

Novamente, você pode executar tudo o que juntos em uma única linha, mas quebrá-lo se torna um pouco mais fácil de ler. Eu dei os meus parâmetros um [parameter ()] decorador e ambos definida como obrigatória.

Se alguém tenta executar o meu script e se esquece de um ou ambos os parâmetros, o shell irá pedir para eles automaticamente. Não há nenhum trabalho extra minha parte necessária para que isso aconteça. Também defini – ComputerName como sendo na primeira posição, mas – FilePath deve ser fornecido pelo nome.

Existem algumas outras vantagens em usar a Directiva [RuntimeDefinedParameter]. Por um lado, ele garante o meu script ou função terá todos os parâmetros do Windows PowerShell comuns, incluindo – verbose e –Debug. Agora, eu posso usar o Write-Verbose e Write-Debug meu script ou função, e sua saída será eliminada automaticamente.

Executar o script ou função – verbose ou –Debug, e Write-Verbose ou Write-Debug (respectivamente) são magicamente ativados. Que é uma ótima maneira de produzir informações de progresso passo a passo (Write-Verbose) ou adicionar pontos de interrupção de depuração (Write-Debug) em seus scripts.

Como eles são escritos no momento, ambos os parâmetros irão aceitar apenas um único valor. Declará-los como [string []] iria deixá-los a aceitar uma coleção inteira de valores. Você teria então enumerar isso usando um loop Foreach, assim você pode trabalhar com um valor por vez.

Outro tipo de parâmetro puro é [comutador]:

Param([switch]$DoSomething)

Agora, eu posso correr o meu script ou uma função com nenhum parâmetro de –DoSomething e internamente a variável $DoSomething será $False. Se eu executar o script com o –DoSomething parâmetro, $DoSomething é definido como $True. Não é necessário passar um valor para o parâmetro. Windows PowerShell define como $True, se você simplesmente incluí-lo. Isso é como operam os parâmetros de opção, como o parâmetro de –recurse de Get-ChildItem.

Tenha em mente que cada parâmetro é sua própria entidade, e é separado do próximo parâmetro por uma vírgula. Você vai notar que no exemplo anterior:

[CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$computerName, [Parameter(Mandatory=$True)] [string]$filePath )

O parâmetro – ComputerName inteira, incluindo seu decorador [parameter ()], aparece antes da vírgula. A vírgula indica que eu sou feito explicando o primeiro parâmetro e estou pronto para passar para a próxima. Tudo associado – FilePath segue a vírgula. Se eu precisava de um terceiro parâmetro, gostaria de colocar outra vírgula:

[CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$computerName, [Parameter(Mandatory=$True)] [string]$filePath, [switch]$DoSomething )

Tudo isso está contido dentro do bloco de Param(). Observe que você não tem que usar o decorador [parameter ()] em cada parâmetro. Utilize-os onde você precisa declarar alguma coisa, como o parâmetro sendo obrigatório, aceitando a entrada de pipeline, sendo em uma determinada posição e assim por diante. Execute about_functions_advanced_parameters de ajuda no Windows PowerShell para obter mais informações sobre outros atributos que você pode declarar dessa forma.

Escrever scripts que aceitam a entrada somente através de parâmetros e funções é uma prática recomendada. Torna mais independente, mais fácil de documento e mais consistente com a maneira como o resto das obras shell.

Don Jones

**Don Jones**é um receptor do prêmio de MVP da Microsoft e autor de "Aprender Windows PowerShell em um mês de almoços" (Manning Publications, 2011), um livro concebido para ajudar qualquer administrador tornar-se eficaz com o Windows PowerShell. Jones também oferece treinamento de Windows PowerShell do público e no local. Entre em contato com ele através do ConcentratedTech.com ou bit.ly/AskDon.

Conteúdo relacionado