Parâmetros da Função PowerShell: Um Guia Prático para Construir Funções Melhores

Construir funções no PowerShell é uma ótima maneira de tornar seus scripts modulares e reutilizáveis. Mas se você deseja que essas funções sejam adaptáveis em diferentes cenários, adicionar parâmetros de função pode levá-las para o próximo nível.

Neste tutorial, vamos expandir uma função básica de registro adicionando parâmetros para controlar a mensagem de log, o caminho do arquivo e a validação.

No final, você verá como os parâmetros podem tornar suas funções versáteis, resistentes a erros e poderosas adições ao seu conjunto de ferramentas do PowerShell.

Definindo a Função Básica Write-Log

Começaremos com uma função básica que aceita um único parâmetro de entrada para a mensagem de log e a anexa a um arquivo de log padrão com um carimbo de data/hora.

No exemplo:

  • O parâmetro $LogMessage é marcado como obrigatório, então o PowerShell solicitará se você não fornecer um valor.
  • Cada entrada de log inclui um carimbo de data/hora formatado como HH:mm:ss.
function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$LogMessage
    )
    $timeGenerated = Get-Date -Format HH:mm:ss
    Add-Content -Path "C:\Scripts\software_installer.log" -Value "$timeGenerated - $LogMessage"
}

Testando a Função Write-Log

Agora que a função Write-Log tem uma estrutura básica e aceita parâmetros, é hora de testar sua funcionalidade. Testar ajuda a garantir que cada aspecto da função, desde configurações padrão até entradas personalizadas, funcione como esperado e trate erros de maneira adequada.

Teste a função Write-Log chamando-a com uma mensagem personalizada:

Write-Log -LogMessage 'Testing a new log message'

Este comando adiciona uma nova entrada com um carimbo de data/hora ao arquivo de log (C:\Scripts\software_installer.log).

Algumas coisas a notar sobre a função Write-Log:

Standardized Information Logging By setting a default path for the log file, you don’t have to specify the file name every time you call the function. This standardizes all log information to a single file, keeping your logs organized.
Processo de Registro Simplificado A função abstrai detalhes como obter a data e hora atual com Get-Date e anexar conteúdo com Add-Content. Como usuário da função, você pode se concentrar exclusivamente em escrever mensagens no arquivo de log sem precisar lembrar desses detalhes.
Melhoria na Legibilidade do Código A função registra explicitamente mensagens em um arquivo de log designado, deixando claro que o propósito é o registro, em vez de simplesmente escrever em um arquivo de texto genérico. Isso torna o código mais autoexplicativo e mais fácil de entender à primeira vista.

Com essas melhorias, a função Write-Log ajuda a simplificar tarefas de registro, tornando os scripts mais limpos e mais fáceis de manter.

Você pode ver a última mensagem de log verificando o conteúdo do arquivo de log:

Get-Content -Path "C:\Scripts\software_installer.log"

Este comando exibe todas as entradas de log, incluindo sua última mensagem com um carimbo de data e hora.

Mas talvez você tenha chamado acidentalmente Write-Log sem um parâmetro LogMessage:

Write-Log

Você notará que—porque LogMessage é obrigatório—o PowerShell impedirá a execução da função. No entanto, se LogMessage não fosse obrigatório, uma mensagem vazia seria gravada, criando uma entrada indesejada de “oops”.

Verifique o resultado verificando novamente o arquivo de log:

Get-Content -Path "C:\Scripts\software_installer.log"

Adicionando Flexibilidade com um Caminho de Arquivo de Log Personalizado

Enquanto a função funciona muito bem, vamos torná-la ainda mais flexível adicionando um parâmetro $LogFilePath. Este parâmetro permite que você especifique um caminho de arquivo personalizado, fornecendo um caminho padrão.

function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$LogMessage,

        [Parameter()]
        [string]$LogFilePath = 'C:\Scripts\software_installer.log'
    )
    $timeGenerated = Get-Date -Format HH:mm:ss
    Add-Content -Path $LogFilePath -Value "$timeGenerated - $LogMessage"
}

Observe que $LogFilePath tem um caminho padrão de C:\Scripts\software_installer.log, mas você pode fornecer qualquer caminho válido.

Para especificar um caminho de arquivo diferente, chame Write-Log assim:

Write-Log -LogMessage 'Custom path log message' -LogFilePath 'C:\Scripts\custom_log.log'

Impondo o Caminho do Arquivo com ValidateScript

Você não quer que sua função registre arquivos que não existem. Para isso, você pode garantir que o arquivo exista antes de fazer o registro usando o atributo de parâmetro ValidateScript. Este atributo permite que você execute código contra o valor de um parâmetro, verificando-o antes de executar a função.

function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$LogMessage,

        [Parameter()]
        [ValidateScript({ Test-Path -Path $_ })]
        [string]$LogFilePath = 'C:\Scripts\software_installer.log'
    )
    $timeGenerated = Get-Date -Format HH:mm:ss
    Add-Content -Path $LogFilePath -Value "$timeGenerated - $LogMessage"
}

Com ValidateScript, Write-Log verifica se o caminho do arquivo fornecido existe. Se o arquivo não existir, o PowerShell é interrompido e retorna um erro.

Você pode criar um arquivo vazio antes de chamá-lo para garantir que a função funcione conforme o esperado:

Set-Content -Path 'C:\Scripts\softwarex_installer.log' -Value ''
Write-Log -LogMessage 'Log entry in a new file' -LogFilePath 'C:\Scripts\softwarex_installer.log'

Testando a Funcionalidade e Validações do Write-Log

Depois de adicionar flexibilidades à sua função, é natural testar se ela funciona conforme o esperado. Você deve garantir uma funcionalidade de registro robusta examinando o atributo ValidateScript e ver como ele aprimora sua função Write-Log.

Vamos ver como ValidateScript funciona tentando fazer log em um arquivo inexistente:

Write-Log -LogMessage 'Finishing install...' -LogFilePath 'C:\Scripts\softwarex_installer.log'

Neste caso, o atributo ValidateScript verifica se o caminho do arquivo de log especificado existe chamando Test-Path. Se o caminho não existir, a função retorna um erro.

A função falha porque C:\Scripts\softwarex_installer.log não existe. Você pode verificar isso executando Test-Path manualmente:

Test-Path 'C:\Scripts\softwarex_installer.log'

Como Test-Path retorna $false, o arquivo está realmente ausente.

Para corrigir isso, crie um arquivo de log em branco e teste novamente.

Set-Content -Path 'C:\Scripts\softwarex_installer.log' -Value ''
Write-Log -LogMessage 'Finishing install...' -LogFilePath 'C:\Scripts\softwarex_installer.log'

Agora, a função funciona conforme esperado.

Confirme o resultado visualizando o arquivo de log:

Get-Content -Path 'C:\Scripts\softwarex_installer.log'

O uso de ValidateScript e outros atributos de validação de parâmetros garante o uso correto dos parâmetros da função, reduzindo erros e tornando suas funções do PowerShell mais confiáveis.

Conclusão

Adicionar parâmetros às funções do PowerShell aumenta significativamente sua flexibilidade e utilidade. Com uma combinação de valores padrão, atributos obrigatórios e validação, suas funções podem lidar com uma variedade de entradas mantendo a confiabilidade.

Usando essas técnicas, você pode agora construir funções escaláveis e amigáveis ao usuário que se encaixam perfeitamente em vários scripts.

Expanda essas habilidades à medida que cria ferramentas do PowerShell mais avançadas para otimizar e aprimorar seu fluxo de trabalho. Confira este tutorial sobre Parâmetros do PowerShell e aprofunde-se nos parâmetros da função!

Source:
https://adamtheautomator.com/powershell-function-parameters/