Formatação de saída
Nesta aula, você aprenderá a controlar a saída de comandos no PowerShell usando Format-Table, Format-List e Format-Wide, além de entender quando a formatação ocorre e os cuidados necessários para evitar problemas de desempenho e visualização.
No PowerShell, a saída de comandos é geralmente exibida em formato de tabela, mas nem sempre esse é o melhor formato para ler ou processar os dados. A formatação de saída permite que você adapte a apresentação dos resultados conforme a necessidade, seja para leitura humana, seja para exportação. Nesta aula, vamos explorar os principais cmdlets de formatação — Format-Table, Format-List e Format-Wide — e entender como o pipeline decide quando formatar.
Compreender a formatação é essencial para criar scripts legíveis e eficientes. Você aprenderá a selecionar propriedades, controlar a largura das colunas, agrupar resultados e evitar armadilhas comuns, como a formatação prematura que pode quebrar a saída de dados.
Format-Table, Format-List
Os dois cmdlets mais usados para formatar a saída são Format-Table e Format-List. Format-Table exibe os dados em colunas, ideal para listagens compactas, enquanto Format-List mostra cada propriedade em uma linha separada, útil quando há muitos campos ou valores longos.
Com Format-Table, você pode especificar quais propriedades exibir, definir largura de colunas, alinhamento e até agrupar por uma propriedade. Já Format-List é mais simples: você lista as propriedades desejadas e ele as exibe verticalmente. Ambos aceitam propriedades calculadas, permitindo criar colunas personalizadas.
Exemplo básico:
Get-Process | Format-Table -Property Name, CPU, WorkingSet -AutoSizeNesse exemplo, exibimos apenas os campos Name, CPU e WorkingSet, com ajuste automático de largura. Para ver todas as propriedades de um objeto, use Format-List *:
Get-Service | Format-List *Também é possível criar colunas calculadas. Por exemplo, para exibir o WorkingSet em megabytes:
Get-Process | Format-Table Name, @{Name='Memória (MB)'; Expression={[math]::Round($_.WorkingSet/1MB,2)}}Nesse caso, usamos uma hashtable com as chaves Name (o título da coluna) e Expression (o cálculo). Isso é extremamente útil para transformar dados na saída.
Format-Wide
Format-Wide é usado para exibir uma lista de itens em múltiplas colunas, como uma listagem simples de nomes. Ele é útil quando você quer uma visão geral rápida, sem se preocupar com detalhes de cada item. Por exemplo:
Get-Service | Format-Wide -Column 3Isso exibe os nomes dos serviços em três colunas. Você pode especificar o número de colunas com o parâmetro -Column e também selecionar uma propriedade específica com -Property. É uma ferramenta simples, mas eficiente para listagens compactas.
Quando a formatação acontece
No PowerShell, a formatação não acontece imediatamente quando um comando é executado. Na verdade, os objetos são enviados pelo pipeline e somente quando atingem o final do pipeline é que o sistema decide como exibi-los, com base no tipo de objeto e nos formatos padrão definidos. Isso significa que você pode usar cmdlets como Where-Object e Sort-Object antes de formatar, sem problemas.
Porém, quando você usa um cmdlet de formatação (Format-*), ele transforma os objetos em informações de formatação, que são enviadas ao host. A partir desse ponto, não é possível usar cmdlets que esperam objetos reais, como Export-Csv ou Select-Object. Por isso, é recomendado formatar apenas no final do pipeline.
Exemplo de uso correto:
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 | Format-Table -AutoSizeAqui, a formatação ocorre só no final. Se você inserir Format-Table antes de Select-Object, o resultado não será o esperado, pois o Select-Object receberá objetos de formatação, não os processos.
Cuidados
Um dos principais cuidados é não usar cmdlets de formatação quando você pretende processar os dados adiante. Por exemplo, se você deseja exportar para CSV, não formate antes de exportar, pois o CSV conterá as colunas formatadas, não os dados originais.
Outro cuidado é com o desempenho: formatar grandes quantidades de dados pode ser lento e consumir muita memória. Tente filtrar e selecionar apenas o necessário antes de formatar.
Além disso, lembre-se de que a formatação é apenas visual. Os dados subjacentes não são alterados. Se você precisar de uma saída específica para um arquivo, considere usar Out-File ou Export-Csv em vez de depender da formatação da tela.
Boas práticas
- Sempre formate no final do pipeline, após filtrar e selecionar dados.
- Use
-AutoSizeemFormat-Tablepara melhorar a legibilidade. - Prefira
Format-Listquando houver muitas propriedades ou valores longos. - Evite formatar antes de exportar dados; use cmdlets de exportação diretamente.
- Para saídas personalizadas, use propriedades calculadas em vez de modificar os objetos.
Referências
- Documentação oficial do Format-Table
- Documentação oficial do Format-List
- Documentação oficial do Format-Wide
- Usando comandos de formatação para alterar a exibição
- Sobre pipelines e formatação no PowerShell
- About Pipelines
Exercícios
- Formatação básica com Format-Table: Liste todos os processos do sistema, exibindo apenas as propriedades
Name,CPUeWorkingSet, usandoFormat-Tablecom-AutoSize. - Format-List com propriedades calculadas: Exiba todos os serviços usando
Format-List, mas inclua uma propriedade calculada chamada 'StatusComoTexto' que mostre 'Ativo' se o status for 'Running' e 'Parado' caso contrário. - Format-Wide: Use
Format-Widepara exibir os nomes dos serviços em 4 colunas. - Ordem de formatação: Explique por que o comando abaixo não funciona como esperado e corrija-o:
Get-Process | Format-Table -AutoSize | Sort-Object CPU -Descending | Select-Object -First 3 - Exportação: Escreva um comando que exporte os processos com maior consumo de memória (WorkingSet) para um CSV, sem usar formatação explícita. Dica: use
Sort-ObjecteSelect-Object.
Get-Process | Format-Table Name, CPU, WorkingSet -AutoSizeGet-Service | Format-List Name, Status, @{Name='StatusComoTexto'; Expression={if ($_.Status -eq 'Running') {'Ativo'} else {'Parado'}}}Get-Service | Format-Wide -Column 4Format-Table transforma os objetos em dados de formatação, e Sort-Object e Select-Object esperam objetos reais. A correção é mover a formatação para o final: Get-Process | Sort-Object CPU -Descending | Select-Object -First 3 | Format-Table -AutoSizeGet-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 | Export-Csv -Path top10.csv -NoTypeInformation