Olá pessoal, tudo bem? Espero que sim!
No post de hoje vamos abordar um tema importante nesta jornada de introdução ao Powershell que são as Functions (Funções), que como vimos no post #3, é um CommandType que designa um agrupamento de comandos ou uma sequência de comandos previamente configurada para a execução de uma rotina otimizada com apenas um comando personalizado.
Como criar Funções Personalizadas
Quando você cria uma função você precisa atribuir um nome (cmdlet) para invocar a cadeia de comandos atribuídas dentro da função.
Sintaxe: Function <cmdlet personalizado> { <cadeia de comandos> }
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
PS C:\Users\RobotChicken> Function Get-ArquivosAreaDeTrabalho { Get-ChildItem -Path C:\Users\RobotChicken\Desktop } PS C:\Users\RobotChicken> Get-ArquivosAreaDeTrabalho Diretório: C:\Users\RobotChicken\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 16/06/2019 11:06 Teste d----- 16/06/2019 11:28 Teste2 -a---- 16/06/2019 12:22 420 alias-cont-md.csv -a---- 16/06/2019 12:16 362 alias-cont.csv -a---- 16/06/2019 12:14 15724 alias-personalizados.csv -a---- 16/06/2019 12:12 15414 alias.csv -a---- 11/06/2019 21:12 4996 ISE_bae93d8e-782c-4a23-b87f-8699bfc17ee0_en-US_HelpContent.cab -a---- 11/06/2019 21:12 391 ISE_bae93d8e-782c-4a23-b87f-8699bfc17ee0_HelpInfo.xml -a---- 11/06/2019 20:56 11 printf.txt |
Como podemos observar no exemplo acima, criei a Função Get-ArquivosAreaDeTrabalho onde instrui que o comando para esta Função é a execução do comando Get-ChildItem para retornar os arquivos contidos na minha Área de Trabalho.
Quando declaramos uma Função no Powershell, ela será armazenada para utilização somente na sessão atual do shell, ou seja, se você reiniciar a console, a Função não mais estará disponível havendo a necessidade de ser declarada novamente para uso na sessão atual.
Se você usa Funções declaradas em um script Powershell, é necessário garantir que a Função será declarada antes de sua efetiva chamada, pois, como a leitura do script é recursiva, se você invocar um cmdlet personalizado através de uma Função ainda não processada em um script, o shell não conseguirá interpretar os comandos desta Função, pois, as instruções contidas ainda não foram armazenados no cache de sessão atual onde está sendo executado o script.
Exemplo:
Considerando o seguinte script:
1 2 |
Get-ArquivosAreaDeTrabalho Function Get-ArquivosAreaDeTrabalho { Get-ChildItem -Path C:\Users\RobotChicken\Desktop } |
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\Users\RobotChicken> Get-ArquivosAreaDeTrabalho Function Get-ArquivosAreaDeTrabalho { Get-ChildItem -Path C:\Users\RobotChicken\Desktop } Get-ArquivosAreaDeTrabalho : O termo 'Get-ArquivosAreaDeTrabalho' não é reconhecido como nome de cmdlet, função, arquivo de script ou programa operável. Verifique a grafia do nome ou, se um caminho tiver sido incluído, veja se o caminho está correto e tente novamente. No linha:1 caractere:1 + Get-ArquivosAreaDeTrabalho + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-ArquivosAreaDeTrabalho:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException |
Conforme o exemplo acima, o cmdlet personalizado foi invocado antes da Função atrelada a ele ser declarada, logo o shell não tinha instrução para o que fazer com este comando, então retornou o erro informando que o “termo não é reconhecido“.
Detalhe: Se executarmos novamente o script deste exemplo, o comando será executado com sucesso, pois, no final da execução anterior, acabamos declarando a Função, ou seja, o erro mencionado indicou apenas ao cmdlet desconhecido até então, não abortando totalmente o processo de execução do script, mas apenas a instrução até então desconhecida. Ao executar novamente, conforme a ordem do script, vamos processar os comandos da Função através do cmdlet personalizado e em seguida, declará-la novamente para uso na sessão atual do shell.
Mas como eu faço para implantar uma Função e torná-la nativa em meu shell, sem a necessidade de ficar sempre declarando? Vamos ver no próximo tópico.
Instalar Funções Personalizadas
Se você pretende criar uma Função personalizada que será utilizada com frequência em seu shell, você tem duas opções para armazená-lo de forma nativa ao seu shell para evitar a necessidade de ter que declará-la sempre que precisar.
Instalar Função como parte de seu perfil do Powershell
Este tipo de instalação é limitada ao seu perfil de usuário do Windows, não se estendendo aos demais perfis do computador. Antes de instalar uma Função personalizada ao seu perfil do shell, primeiro vamos a algumas considerações:
$profile: Variável de ambiente do Powershell que retorna o caminho do script de perfil do seu usuário. Por padrão ele existe somente durante a sessão atual, não possuindo um arquivo fixo com suas preferências, então, é necessário criá-lo para manter uma Função que você utiliza com frequência. Vamos ver um exemplo de como criá-lo:
1 2 3 4 5 6 7 |
# Verificar o arquivo ainda não existente do seu perfil PS C:\Users\RobotChicken> $profile C:\Users\RobotChicken\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1 # Criar o arquivo de perfil personalizado PS C:\Users\RobotChicken> notepad.exe $profile |
Como observamos na tela acima, o arquivo de perfil ainda não existe, por isso ao abrir no notepad nós teremos a opção de criá-lo. Clique em “Sim” para que o arquivo seja criado e em seguida, copie e cole toda a cadeia de comando da Função, salve e feche este arquivo.
Agora é só reiniciar o seu shell que o cmdlet personalizado para esta Função estará disponível para uso:
Pronto, agora toda vez que você precisar armazenar uma Função que você utiliza com frequência, basta você adicionar a sua cadeia de comandos ao seu arquivo de profile do Powershell.
Novamente: As Funções armazenadas somente estarão disponíveis para o perfil atual, não se estendendo aos demais perfis de usuário. Para que uma Função Personalizada esteja disponível para todos os usuários do computador, é necessário armazená-la como um Módulo Personalizado do Powershell.
Instalar Função como um Módulo do Powershell
Para instalar uma Função como um Módulo e deixá-la disponível para todos os usuários é bem simples, basta seguir os seguintes passos:
- Salvar a cadeia de comandos de sua Função como Arquivo de Módulos de Script do Powershell (*.psm1):
- Criar pasta com o mesmo nome do arquivo .psm1 e colocá-lo dentro:
- Mover pasta criada para o caminho: C:\Windows\System32\WindowsPowerShell\v1.0\Modules:
Para testar, você pode reiniciar o seu shell, fazer logoff e entrar com outro usuário ou mesmo reiniciar o computador e validar a presença nativa da Função personalizada.
Obs: Quando você instalar uma Função como Módulo, tenha certeza que os demais usuários que eventualmente a utilizarão terão a devida permissão para executar a cadeia de comandos definida na Função. Como observado no exemplo acima, executei a Função personalizada Get-ArquivosAreaDeTrabalho com o usuário LittleBot criada anteriormente para retornar os arquivos de trabalho do usuário RobotChicken. Acontece que o usuário LittleBot está com permissões administrativas elevadas e por isso consegue listar o diretório do outro usuário, caso contrário, receberia um erro de permissão por não ter privilégios administrativos o suficiente para consultar os arquivos da área de trabalho do usuário RobotChicken.
Conclusão
A Função é um excelente recurso para simplificar a construção de um script, podendo ser utilizada para evitar a repetição de grandes blocos de comandos e para tornar seu script mais simples e estruturado. É um recurso que pode e deve ser ‘usado e abusado’ e com uma extensa aplicabilidade na construção de sua automação.
É isso aí galera, por hoje é só. 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!
[…] último post observamos o exemplo da Função personalizada Get-ArquivosAreaDeTrabalho. Quando falamos sobre a […]
[…] 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. […]
[…] Pensando em um gerenciamento ágil, criei também a versão do script no formato de Função. Desta forma, você pode instalá-lo em seu computador para que passe a utilizar como um comando nativo do Powershell. Se você ainda não sabe instalar Funções dá uma olhadinha no Post #6. […]