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 -AutoSize

Nesse 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 3

Isso 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 -AutoSize

Aqui, 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 -AutoSize em Format-Table para melhorar a legibilidade.
  • Prefira Format-List quando 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

Exercícios

  1. Formatação básica com Format-Table: Liste todos os processos do sistema, exibindo apenas as propriedades Name, CPU e WorkingSet, usando Format-Table com -AutoSize.
  2. ✓ Resposta:
    Get-Process | Format-Table Name, CPU, WorkingSet -AutoSize
  3. 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.
  4. ✓ Resposta:
    Get-Service | Format-List Name, Status, @{Name='StatusComoTexto'; Expression={if ($_.Status -eq 'Running') {'Ativo'} else {'Parado'}}}
  5. Format-Wide: Use Format-Wide para exibir os nomes dos serviços em 4 colunas.
  6. ✓ Resposta:
    Get-Service | Format-Wide -Column 4
  7. 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
  8. ✓ Resposta: O comando falha porque Format-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 -AutoSize
  9. 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-Object e Select-Object.
  10. ✓ Resposta:
    Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 | Export-Csv -Path top10.csv -NoTypeInformation