Olá pessoal, tudo bem? Espero que sim!
Continuando o tema Funções (Function) do Powershell, hoje vamos falar de um “atributo” que não é exatamente um atributo, mas sim uma técnica muito legal que pode ser utilizada tanto em Funções como em scripts do dia-a-dia. Estou falando da técnica de Splatting.
O que é Splatting?
Splatting é uma técnica de script onde você cria um dicionário ou lista para referenciar parâmetros em uma variável para posteriormente repassá-los a comandos. Você representa um dicionário de splatting utilizando uma variável e um ou mais parâmetros declarado entre “@{}” onde o parâmetro deverá representar um dos disponíveis do comando a ser executado junto com o valor correspondente. Para invocar este dicionário após a declaração, basta usar @variável.
Sintaxe para declaração: $variável = @{Parametro = <valor>}
Sintaxe para execução: <comando> @variável
Exemplo:
Considere as seguintes variáveis com splatting:
1 2 |
$ArquivoAntigo = @{Path = "C:\Users\RobotChicken\Desktop\alias.csv"} $NovoArquivo = @{NewName = "alias-novo.csv"} |
Após declará-las, toda a vez que eu precisar usar o parâmetro Path referenciando o caminho do arquivo “C:\Users\RobotChicken\Desktop\alias.csv”, precisarei apenas chamar o dicionário @ArquivoAntigo, que o parâmetro do comando já estará pronto para uso:
1 2 3 4 5 6 7 8 |
# Verificar as propriedades de um arquivo existente PS C:\Users\RobotChicken> Get-Item @ArquivoAntigo Diretório: C:\Users\RobotChicken\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 16/06/2019 12:12 15414 alias.csv |
Eu também posso combinar o dicionário declarado na variável $ArquivoAntigo com o parâmetro declarado na variável $NovoArquivo para renomear o arquivo de referência:
1 2 3 4 5 6 7 8 9 10 11 |
# Renomear um arquivo PS C:\Users\RobotChicken> Rename-Item @ArquivoAntigo @NovoArquivo # Verificar as propriedades de um arquivo existente PS C:\Users\RobotChicken> Get-Item C:\Users\RobotChicken\Desktop\alias-novo.csv Diretório: C:\Users\RobotChicken\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 16/06/2019 12:12 15414 alias-novo.csv |
No exemplo acima, passamos no dicionário @ArquivoAntigo o parâmetro Path, que é compatível com o comando Rename-Item. Combinado com o parâmetro NewName que também é compatível com o cmdlet, a operação foi executada com sucesso. Basicamente seria como se executássemos o seguinte comando:
1 |
Rename-Item -Path "C:\Users\RobotChicken\alias.csv" -NewName "alias-novo.csv" |
Obs1: Quando combinar diversos dicionários criados com splatting em comandos, certifique-se que o comando dispõe de todos os parâmetros declarados nas variáveis utilizadas com splatting.
Obs2: Para invocar dicionários implantados dentro de uma Função, primeiramente esta deve ser declarada ou você deve torná-la nativa em seu shell realizando a sua instalação, conforme explicado no post #6.
Utilizando o Splatting para definir atributos de Parâmetro
Podemos utilizar a técnica de splatting para capturar e utilizar parâmetros de comandos em Funções personalizadas. Isto pode ser feito, utilizando o termo @Args para representar todos os parâmetros disponíveis para o comando em questão.
Sintaxe: Function <nome da função> {<comando> @Args}
Exemplo:
1 |
Function Verificar-Processos {Get-Process @Args} |
1 2 3 4 5 |
PS C:\Users\RobotChicken> Verificar-Processos -Name explorer Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 2815 119 75724 134916 97,58 7436 3 explorer |
Como podemos observar no exemplo acima, quando declaramos o termo @Args para o comando Get-Process na Função Verificar-Processos, estamos basicamente repassando para a Função todos os parâmetros do comando Get-Process. A partir daqui, a nossa Função é capaz de realizar todas as operações do comando especificado.
Podemos combinar a técnica de splatting com parâmetros de alternância, que aprendemos a utilizar no último post.
Considere o exemplo:
1 2 3 4 |
Function Criar-Remover-Arquivo {Param ([switch]$criar,[switch]$remover) If($criar){New-Item @Args} If($remover){Remove-Item @Args} } |
Nesta Função combinei dois parâmetros de alternância, $criar e $remover, para referenciar partes de minha Função, e utilizando o operador lógico If, caso eu utilize o parâmetro -criar, poderei utilizar também todos os parâmetros disponíveis do comando New-Item para criação de arquivos. Da mesma forma, se utilizar o parâmetro -remover, poderei utilizar os parâmetros disponíveis do comando Remove-Item.
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Criar o arquivo PS C:\Users\RobotChicken> Criar-Remover-Arquivo -criar -Path "C:\Users\RobotChicken" -Name "alias-novo-denovo.csv" -ItemType File Diretório: C:\Users\RobotChicken Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 26/06/2019 21:47 0 alias-novo-denovo.csv # Remover o arquivo PS C:\Users\RobotChicken> Criar-Remover-Arquivo -remover -Path "C:\Users\RobotChicken\alias-novo-denovo.csv" -Force # Verificar se o arquivo ainda existe PS C:\Users\RobotChicken> Get-Item "C:\Users\RobotChicken\alias-novo-denovo.csv" Get-Item : Não é possível localizar o caminho 'C:\Users\RobotChicken\alias-novo-denovo.csv' porque ele não existe. No linha:1 caractere:1 + Get-Item "C:\Users\RobotChicken\alias-novo-denovo.csv" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\Users\RobotC...novo-denovo.csv:String) [Get-Item], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand |
Conclusão
Utilizando a técnica de splatting podemos maximizar as possibilidades de utilização de uma Função personalizada. Podemos pegar os principais comandos que costumamos utilizar e criar uma Função única onde poderemos realizar através de parâmetros qualquer tipo de operação. É uma técnica que pode ser utilizada para diversas finalidades com o objetivo de otimizar e simplificar cada vez mais suas linhas de comando, evitando que você crie scripts muito extensos e com blocos de comandos repetitivos. É para usar e abusar, risos.
Ok. Acredito que já está na hora de falarmos sobre Variáveis, pois, cada vez mais estamos utilizando-as nos exemplos aqui do blog, então nada mais justo do que abordarmos o que são variáveis, por que utilizá-las, como utilizá-las e suas principais aplicabilidades, então… até o próximo post!
Dúvidas, sugestões, críticas? Entre em contato aqui!
Gostou? Deixe seu comentário e não se esqueçam de curtir a página do Facebook na barra lateral!