Gerando relatórios
LidoNesta aula, você aprenderá a gerar relatórios profissionais com PowerShell, desde a coleta de dados até a exportação em CSV e HTML, além de como agendar a geração automática de relatórios. Vamos explorar cmdlets essenciais, técnicas de formatação e boas práticas para automatizar a criação de relatórios úteis e legíveis.
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/catchpara 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 comoMailozaurr).
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
- Documentação oficial do Export-Csv
- Documentação oficial do ConvertTo-Html
- Documentação do Register-ScheduledTask
- Criando caixas de entrada personalizadas (exemplo de formatação)
- Sobre formatação de arquivos .ps1xml
- Trabalhando com arquivos e pastas
Exercícios
- 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".
- 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".
- 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.
- Exercício 4: Crie uma tarefa agendada que execute um script chamado "relatorio.ps1" todos os dias às 9h.
- Exercício 5: Escreva um script que agrupe os serviços por Status e exporte a contagem em um arquivo CSV.
Get-Process | Select-Object Name, CPU, WorkingSet | Export-Csv -Path "C:\Relatorios\processos.csv" -NoTypeInformation$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"Get-Process | Select-Object Name, @{Name='Memoria (MB)'; Expression={[math]::Round($_.WorkingSet/1MB,2)}} | Format-Table -AutoSize$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 $triggerGet-Service | Group-Object Status | Select-Object Name, Count | Export-Csv -Path "C:\Relatorios\status_servicos.csv" -NoTypeInformation