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:

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:

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:

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!