Bem-vindo à aula sobre geração de relatórios com PowerShell. Nesta etapa do curso, você vai dominar uma das tarefas mais comuns e valiosas no dia a dia de um profissional de TI: transformar dados brutos em relatórios informativos e bem estruturados. O PowerShell oferece uma combinação poderosa de cmdlets para coletar, processar e exportar dados, além de integrar-se com o Agendador de Tarefas do Windows para automatizar a geração periódica de relatórios.

Vamos começar entendendo como coletar dados de diversas fontes, depois aprenderemos a formatá-los de maneira clara e, por fim, exportá-los em formatos como CSV e HTML. Ao final, você será capaz de criar relatórios automáticos que podem ser enviados por e-mail ou publicados em um site, tudo com código limpo e eficiente.

Coletando dados

A coleta de dados é o primeiro passo para qualquer relatório. O PowerShell fornece uma vasta gama de cmdlets que permitem obter informações do sistema, de serviços, de processos, de eventos, de arquivos, de bancos de dados e até de APIs externas. A chave é saber selecionar os dados certos e armazená-los em variáveis para processamento posterior.

Alguns cmdlets essenciais para coleta de dados incluem Get-Process, Get-Service, Get-EventLog (ou Get-WinEvent), Get-ChildItem e Get-CimInstance. Por exemplo, para obter informações sobre a memória do sistema, você pode usar Get-CimInstance Win32_OperatingSystem. Para listar todos os serviços em execução, Get-Service | Where-Object {$_.Status -eq 'Running'}.

É importante também saber combinar dados de várias fontes. O PowerShell permite armazenar objetos em arrays e hashtables, e você pode criar objetos personalizados com [PSCustomObject] para consolidar informações. Vamos ver um exemplo prático de coleta de dados sobre processos e seus respectivos usuários:

# Coleta de processos com informações de uso de CPU e memória
$processes = Get-Process | Select-Object Name, CPU, WorkingSet, StartTime

# Exibir os primeiros 5 processos
$processes | Select-Object -First 5

Outro exemplo: coletar informações de serviços e seus status:

$services = Get-Service | Select-Object Name, DisplayName, Status, StartType
$services | Where-Object {$_.Status -eq 'Running'}

Para relatórios mais complexos, você pode consultar o Active Directory, se tiver o módulo AD, ou usar Invoke-RestMethod para APIs web. A coleta de dados é a base; sem dados precisos, o relatório não terá valor.

Formatando

Depois de coletar os dados, é hora de formatá-los para que fiquem legíveis e apresentáveis. O PowerShell oferece vários cmdlets de formatação, como Format-Table, Format-List e Format-Wide. A formatação adequada é crucial para relatórios que serão lidos por humanos.

O cmdlet Format-Table é o mais comum para exibir dados em colunas. Você pode especificar as propriedades a exibir, definir larguras, alinhamento e até usar expressões calculadas. Por exemplo:

Get-Process | Format-Table Name, CPU, WorkingSet -AutoSize

Para relatórios mais detalhados, Format-List mostra cada propriedade em uma linha separada, útil quando você tem muitos campos. Já Format-Wide exibe em várias colunas, ideal para listas simples.

Além dos cmdlets nativos, você pode usar operadores de formatação de strings para ajustar valores, como ToString() ou '{0:N2}' -f $value para números com duas casas decimais. Isso é útil para tornar os dados mais amigáveis, por exemplo, convertendo bytes em megabytes ou formatando datas.

$processes = Get-Process | Select-Object Name,
    @{Name='Memory (MB)'; Expression={[math]::Round($_.WorkingSet/1MB,2)}},
    @{Name='CPU (s)'; Expression={[math]::Round($_.CPU,2)}}
$processes | Format-Table -AutoSize

Outra técnica é usar Sort-Object e Group-Object para organizar os dados antes de formatar. Por exemplo, agrupar serviços por status:

Get-Service | Group-Object Status | Format-Table Name, Count -AutoSize

A formatação também inclui a criação de cabeçalhos e rodapés personalizados. Você pode criar um relatório em texto puro com Out-String e manipular o conteúdo, mas para relatórios mais profissionais, a exportação para HTML (que veremos a seguir) oferece mais controle.

Exportando (CSV, HTML)

A exportação é o que torna o relatório reutilizável e compartilhável. Os formatos mais comuns são CSV (para dados tabulares que podem ser abertos em Excel) e HTML (para visualização em navegador com formatação rica). O PowerShell fornece cmdlets específicos: Export-Csv e ConvertTo-Html (ou Out-File combinado com ConvertTo-Html).

Para exportar para CSV, você simplesmente canaliza os dados para Export-Csv e especifica o caminho do arquivo. É importante usar -NoTypeInformation para omitir a linha de tipo, que é desnecessária. Veja um exemplo:

$services = Get-Service | Select-Object Name, DisplayName, Status, StartType
$services | Export-Csv -Path "C:\Relatorios\servicos.csv" -NoTypeInformation

Para HTML, o cmdlet ConvertTo-Html gera uma tabela HTML a partir dos objetos. Você pode personalizar o título, o cabeçalho e o CSS. Por exemplo:

$processes = Get-Process | Select-Object Name, CPU, WorkingSet
$html = $processes | ConvertTo-Html -Title "Relatório de Processos" -CssUri "style.css"
$html | Out-File -FilePath "C:\Relatorios\processos.html"

Uma abordagem mais elaborada é criar um relatório HTML completo com cabeçalho, resumo e tabela, usando fragmentos HTML. Você pode combinar ConvertTo-Html com -Fragment para gerar apenas a tabela e depois montar o HTML manualmente.

$header = "

Relatório de Serviços

Gerado em $(Get-Date)

" $fragment = Get-Service | ConvertTo-Html -Fragment $html = "Relatório$header $fragment" $html | Out-File -FilePath "C:\Relatorios\servicos.html"

Além desses, você pode exportar para JSON (ConvertTo-Json), XML (Export-Clixml) ou até mesmo para Excel usando módulos de terceiros como o ImportExcel. A escolha do formato depende do público-alvo: CSV para análise de dados, HTML para visualização rápida, JSON para integração com sistemas.

Agendamento

Automatizar a geração de relatórios é o que diferencia um script ocasional de uma solução profissional. O Windows oferece o Agendador de Tarefas (Task Scheduler) que pode executar scripts PowerShell em horários específicos ou em resposta a eventos. Você pode criar tarefas agendadas via interface gráfica ou via PowerShell usando o módulo ScheduledTasks.

Para criar uma tarefa que execute um script PowerShell diariamente às 8h, você pode usar os cmdlets New-ScheduledTaskTrigger, New-ScheduledTaskAction e Register-ScheduledTask. Veja um exemplo:

$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\gerar-relatorio.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 8am
Register-ScheduledTask -TaskName "Relatorio Diario" -Action $action -Trigger $trigger

Além de agendar no sistema operacional, você também pode usar o Start-Job para executar scripts em segundo plano dentro de uma sessão PowerShell, mas isso não persiste após a sessão fechar. Para relatórios recorrentes, o Agendador de Tarefas é a solução correta.

É importante considerar também a execução com privilégios elevados, se o script precisar acessar recursos protegidos. Você pode configurar a tarefa para executar como um usuário específico ou com “Executar com privilégios mais altos”.

Outra abordagem é usar o Register-ScheduledJob, que cria um job agendado no PowerShell, mas essa funcionalidade está obsoleta em versões mais recentes, sendo preferível usar o Agendador de Tarefas padrão.

Para testar o agendamento, você pode usar o parâmetro -RunNow ou iniciar a tarefa manualmente com Start-ScheduledTask. Sempre verifique os logs de execução para garantir que o script foi executado sem erros.

Boas práticas e observações finais

Ao gerar relatórios, algumas boas práticas podem melhorar a qualidade e a manutenção dos seus scripts:

  • Use funções para encapsular a lógica de coleta, formatação e exportação, tornando o código reutilizável.
  • Trate erros com try/catch para que falhas não interrompam a geração do relatório.
  • Documente o script com comentários e help baseado em comentários (Get-Help).
  • Teste com dados reais antes de agendar, para evitar surpresas.
  • Mantenha os relatórios em um local centralizado e, se possível, envie por e-mail usando Send-MailMessage (ou módulos modernos como Mailozaurr).

Com essas técnicas, você pode criar relatórios robustos e automatizados que economizam tempo e fornecem informações valiosas para tomada de decisões.

Referências

Exercícios

  1. Exercício 1: Crie um script que colete a lista de processos em execução, selecione as propriedades Name, CPU e WorkingSet, e exporte para um arquivo CSV chamado "processos.csv".
  2. ✓ Resposta:
    Get-Process | Select-Object Name, CPU, WorkingSet | Export-Csv -Path "C:\Relatorios\processos.csv" -NoTypeInformation
  3. Exercício 2: Gere um relatório HTML dos serviços do sistema, mostrando Name, Status e StartType, com título "Relatório de Serviços". Salve como "servicos.html".
  4. ✓ Resposta:
    $services = Get-Service | Select-Object Name, Status, StartType
    $html = $services | ConvertTo-Html -Title "Relatório de Serviços"
    $html | Out-File -FilePath "C:\Relatorios\servicos.html"
  5. Exercício 3: Formate a saída do Get-Process para mostrar a memória em MB com duas casas decimais, usando uma expressão calculada.
  6. ✓ Resposta:
    Get-Process | Select-Object Name, @{Name='Memoria (MB)'; Expression={[math]::Round($_.WorkingSet/1MB,2)}} | Format-Table -AutoSize
  7. Exercício 4: Crie uma tarefa agendada que execute um script chamado "relatorio.ps1" todos os dias às 9h.
  8. ✓ Resposta:
    $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\relatorio.ps1"
    $trigger = New-ScheduledTaskTrigger -Daily -At 9am
    Register-ScheduledTask -TaskName "Relatorio Diario" -Action $action -Trigger $trigger
  9. Exercício 5: Escreva um script que agrupe os serviços por Status e exporte a contagem em um arquivo CSV.
  10. ✓ Resposta:
    Get-Service | Group-Object Status | Select-Object Name, Count | Export-Csv -Path "C:\Relatorios\status_servicos.csv" -NoTypeInformation