Módulos no PowerShell são pacotes que contêm comandos (cmdlets, funções, etc.) e recursos que podem ser importados para o ambiente de sessão. Eles permitem organizar funcionalidades relacionadas, facilitam o compartilhamento e a reutilização de código. Dominar módulos é fundamental para aproveitar ao máximo o PowerShell, seja usando módulos prontos da comunidade ou criando os seus próprios.

Nesta aula, vamos explorar o que são módulos, como importá-los, como listar os módulos disponíveis e como trabalhar com a Galeria do PowerShell, o repositório oficial de módulos. Ao final, você estará apto a gerenciar módulos de forma eficiente em seus scripts e sessões.

O que são

Um módulo no PowerShell é um conjunto de funcionalidades relacionadas, empacotadas como uma unidade. Ele pode conter cmdlets, funções, variáveis, aliases e até mesmo recursos como arquivos de ajuda. Os módulos são a forma moderna de distribuir e organizar código no PowerShell, substituindo em grande parte os antigos snap-ins.

Existem dois tipos principais de módulos: módulos binários (escritos em linguagens como C#) e módulos de script (escritos em PowerShell). Os módulos de script são arquivos .psm1 que contêm funções e lógica. Os módulos podem ser instalados em diretórios específicos do sistema ou do usuário, e o PowerShell os descobre automaticamente quando você tenta usar um comando que pertence a um módulo não carregado.

Um módulo normalmente inclui um manifesto (.psd1) que descreve seus metadados, como versão, autor, e quais arquivos fazem parte. O manifesto ajuda o PowerShell a gerenciar dependências e a carregar o módulo corretamente.

Exemplo de estrutura de um módulo de script simples:

# MeuModulo.psm1
function Get-Saudacao {
    param([string]$nome)
    "Olá, $nome!"
}

# MeuModulo.psd1 (manifesto)
@{
    RootModule = 'MeuModulo.psm1'
    ModuleVersion = '1.0.0'
    Author = 'Seu Nome'
    FunctionsToExport = @('Get-Saudacao')
}

Para usar esse módulo, você o salvaria em um diretório de módulos, como ~\Documents\PowerShell\Modules\MeuModulo, e ele estaria disponível para importação.

Import-Module

O cmdlet Import-Module adiciona um módulo à sessão atual do PowerShell. Embora o PowerShell possa importar módulos automaticamente quando você usa um comando (desde que o módulo esteja em um diretório conhecido), às vezes você precisa importar explicitamente, especialmente se o módulo não estiver no caminho padrão ou se você quiser controlar quais comandos são carregados.

Exemplos de uso:

# Importar um módulo específico
Import-Module -Name AzureAD

# Importar um módulo de um caminho específico
Import-Module -Path C:\MeusScripts\MeuModulo.psm1

# Importar e listar os comandos disponíveis
Import-Module -Name MeuModulo -Verbose
Get-Command -Module MeuModulo

O parâmetro -Force pode ser usado para reimportar um módulo que já foi carregado, útil durante o desenvolvimento. Além disso, você pode usar -Prefix para adicionar um prefixo aos nomes dos comandos importados, evitando conflitos.

O cmdlet Import-Module também aceita o parâmetro -Function, -Cmdlet, etc., para importar seletivamente apenas partes do módulo. Isso pode melhorar o desempenho em sessões grandes.

Get-Module

O cmdlet Get-Module é usado para listar os módulos que estão disponíveis para importação ou que já foram importados na sessão atual. Ele é essencial para descobrir quais módulos você pode usar e para verificar se um módulo específico está carregado.

Exemplos:

# Listar todos os módulos importados na sessão atual
Get-Module

# Listar todos os módulos disponíveis no sistema (não importados)
Get-Module -ListAvailable

# Procurar por módulos que contenham 'Azure' no nome
Get-Module -Name *Azure* -ListAvailable

# Ver detalhes de um módulo específico
Get-Module -Name AzureAD -ListAvailable | Select-Object Name, Version, Author

O parâmetro -ListAvailable mostra módulos que estão instalados, mas não necessariamente importados. Isso é útil para descobrir o que está disponível sem precisar importar todos. Você também pode usar Get-Module para ver os comandos exportados por um módulo:

# Listar comandos de um módulo importado
Get-Module -Name AzureAD | Select-Object -ExpandProperty ExportedCommands

Entender a diferença entre módulos disponíveis e importados é crucial para gerenciar sua sessão de forma eficiente.

Módulos da galeria

A Galeria do PowerShell (PowerShell Gallery) é o repositório central de módulos, scripts e recursos DSC. É o local oficial para compartilhar e baixar módulos criados pela comunidade e pela Microsoft. Você pode acessá-la em powershellgallery.com.

Para gerenciar módulos da galeria, usamos os cmdlets do módulo PowerShellGet, que já vem com o PowerShell 5.1 e superiores. Os principais cmdlets são Find-Module, Install-Module, Update-Module e Uninstall-Module.

Exemplos práticos:

# Procurar por um módulo na galeria
Find-Module -Name Pester

# Procurar por módulos com uma palavra-chave
Find-Module -Name *Azure* | Select-Object Name, Version, Description

# Instalar um módulo da galeria
Install-Module -Name Pester -Scope CurrentUser

# Instalar uma versão específica
Install-Module -Name Pester -RequiredVersion 5.0.0

# Atualizar um módulo instalado
Update-Module -Name Pester

# Remover um módulo instalado
Uninstall-Module -Name Pester

Antes de instalar, o PowerShell pode pedir para confirmar a instalação, a menos que você use -Force. É importante notar que a instalação de módulos da galeria requer confiança no fornecedor, então sempre verifique a origem e o conteúdo do módulo.

Para que o Install-Module funcione, pode ser necessário configurar o repositório PSGallery como confiável. Isso pode ser feito com:

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

Depois de instalado, o módulo fica disponível em sua máquina e pode ser importado como qualquer outro.

Referências

Exercícios

  1. Qual é a diferença entre um módulo binário e um módulo de script? Dê um exemplo de quando usar cada um.

    ✓ Resposta: Módulos binários são compilados em .NET (C#) e são mais rápidos, ideais para cmdlets complexos que exigem alto desempenho ou integração com APIs nativas. Módulos de script são escritos em PowerShell (arquivos .psm1) e são mais fáceis de criar e manter, adequados para automação e funções simples. Exemplo: se você precisa de um cmdlet que interage com uma API de baixo nível, use um módulo binário; se é uma função para manipular arquivos, um módulo de script é suficiente.
  2. Escreva o comando para importar o módulo 'ActiveDirectory' e, em seguida, liste todos os comandos que ele fornece.

    ✓ Resposta:
    Import-Module -Name ActiveDirectory
    Get-Command -Module ActiveDirectory
  3. Explique a diferença entre Get-Module e Get-Module -ListAvailable.

    ✓ Resposta: Get-Module sem parâmetros lista apenas os módulos que já foram importados na sessão atual. Get-Module -ListAvailable lista todos os módulos que estão instalados no sistema, mas não necessariamente importados. O primeiro é útil para ver o que está ativo na sessão; o segundo para descobrir o que está disponível para uso.
  4. Como você instala um módulo chamado 'Pester' da Galeria do PowerShell, garantindo que ele seja instalado apenas para o usuário atual?

    ✓ Resposta: Install-Module -Name Pester -Scope CurrentUser
  5. Qual comando você usaria para atualizar o módulo 'Pester' para a versão mais recente disponível na galeria?

    ✓ Resposta: Update-Module -Name Pester

Boas Práticas e Observações Finais

Ao trabalhar com módulos, siga estas boas práticas:

  • Verifique a origem: antes de instalar um módulo da galeria, verifique o autor, a descrição e a popularidade. Módulos desconhecidos podem conter código malicioso.
  • Use -Scope CurrentUser ao instalar módulos para evitar a necessidade de permissões de administrador e para manter o ambiente do usuário limpo.
  • Prefira o auto-carregamento: quando possível, deixe o PowerShell importar módulos automaticamente. Isso reduz o consumo de memória e acelera a sessão.
  • Gerencie versões: use RequiredVersion ao instalar módulos para garantir consistência em ambientes de produção.
  • Documente suas dependências: em scripts, use #requires -Modules para indicar quais módulos são necessários.

Com esses conhecimentos, você está pronto para explorar o vasto ecossistema de módulos do PowerShell e criar os seus próprios, compartilhando com a comunidade.