Formatação de saída
Esta aula aborda os cmdlets de formatação de saída no PowerShell: Format-Table, Format-List e Format-Wide. Você aprenderá como controlar a exibição dos dados, quando a formatação ocorre automaticamente e cuidados importantes para evitar problemas de performance e comportamento inesperado.
A saída de comandos no PowerShell é automaticamente formatada, mas você pode controlar esse processo usando cmdlets específicos. Compreender como e quando a formatação ocorre é essencial para exibir informações de maneira clara e eficiente, especialmente ao trabalhar com grandes volumes de dados ou scripts complexos.
Nesta aula, exploraremos os principais cmdlets de formatação: Format-Table, Format-List e Format-Wide. Veremos suas particularidades, como personalizar a saída e os cuidados necessários para evitar armadilhas comuns.
Format-Table, Format-List
O cmdlet Format-Table exibe a saída em formato tabular, organizando os dados em colunas. Por padrão, ele tenta encaixar o máximo de propriedades possível, truncando valores longos ou ocultando colunas se não houver espaço. Você pode controlar quais propriedades exibir e até mesmo criar colunas calculadas.
Já Format-List exibe cada propriedade em uma linha separada, com o nome da propriedade seguido pelo valor. É útil quando você precisa visualizar todos os detalhes de um objeto, especialmente se ele tiver muitas propriedades ou valores longos.
Exemplo básico:
Get-Process | Format-Table Name, CPU, WorkingSet -AutoSize
Get-Service | Format-List Name, Status, DisplayNameO parâmetro -AutoSize no Format-Table faz com que as colunas sejam dimensionadas com base no conteúdo, evitando truncamentos. Sem ele, o PowerShell usa tamanhos fixos que podem cortar informações.
Você também pode usar propriedades calculadas:
Get-Process | Format-Table Name, @{Name='CPU (s)'; Expression={$_.CPU.ToString('F2')}}, @{Name='Mem (MB)'; Expression={[math]::Round($_.WorkingSet/1MB,2)}}Isso cria colunas personalizadas com formatação específica.
Format-Wide
O Format-Wide exibe os objetos em formato de grade, com várias colunas de largura fixa, mostrando apenas uma propriedade (geralmente o nome). É ideal para listas simples, como nomes de processos ou serviços.
Exemplo:
Get-Process | Format-Wide Name -Column 4
Get-Service | Format-Wide NameO parâmetro -Column define o número de colunas. Se omitido, o PowerShell escolhe automaticamente com base no tamanho do terminal.
Diferente dos outros cmdlets, Format-Wide não permite selecionar propriedades diferentes — ele sempre usa a propriedade padrão (geralmente Name). Para usar outra propriedade, você pode usar uma expressão calculada, mas é menos comum.
Quando a formatação acontece
A formatação no PowerShell ocorre no momento da exibição, não durante a execução do pipeline. Os objetos passam pelo pipeline como objetos reais, e a formatação é aplicada apenas quando a saída é enviada para o console (ou para um arquivo de texto).
Isso significa que, se você redirecionar a saída para um arquivo CSV (Export-Csv) ou para outro cmdlet que espera objetos, a formatação não é aplicada — os objetos são passados diretamente. Porém, se você usar Out-File ou >, o PowerShell primeiro formata a saída e depois escreve o texto.
Exemplo:
# Exporta objetos reais (sem formatação)
Get-Process | Export-Csv processos.csv -NoTypeInformation
# Salva a saída formatada (como texto)
Get-Process | Format-Table | Out-File processos.txtEntender essa diferença é crucial para evitar problemas ao gerar relatórios ou processar dados posteriormente.
Cuidados
Um cuidado importante é não usar cmdlets de formatação no meio de um pipeline quando você ainda precisa processar os objetos. Por exemplo, Get-Process | Format-Table | Where-Object {...} não funciona porque Format-Table produz objetos de formatação, não mais processos. Sempre coloque a formatação no final do pipeline.
Outro ponto é o desempenho: Format-Table com -AutoSize pode ser lento para grandes conjuntos de dados, pois ele precisa analisar todo o conteúdo antes de exibir. Nesses casos, considere usar Select-Object para limitar a saída ou evitar -AutoSize.
Além disso, evite usar Format-List para muitos objetos, pois a saída pode se tornar extremamente longa e difícil de ler. Prefira Format-Table ou use Out-GridView para interagir visualmente.
Por fim, lembre-se de que a formatação padrão de alguns tipos de objeto (como processos e serviços) já é definida por arquivos de formatação XML. Você pode personalizar esses arquivos, mas isso é avançado e deve ser feito com cuidado.
Boas práticas
Sempre coloque os cmdlets de formatação no final do pipeline. Use -AutoSize apenas quando necessário e para conjuntos pequenos. Prefira Select-Object para limitar propriedades antes de formatar. Quando precisar exportar dados para processamento posterior, use cmdlets como Export-Csv ou ConvertTo-Json em vez de formatar.
Exercícios
Use
Get-Servicepara listar serviços, exibindo apenas as propriedadesName,StatuseStartTypeem formato de tabela com ajuste automático de largura.✓ Resposta:Get-Service | Format-Table Name, Status, StartType -AutoSizeCrie uma propriedade calculada no
Format-Tableque exiba a memória (WorkingSet) dos processos em megabytes (MB), com duas casas decimais.✓ Resposta:Get-Process | Format-Table Name, @{Name='Memória (MB)'; Expression={[math]::Round($_.WorkingSet/1MB,2)}}Use
Format-Listpara exibir todos os detalhes de um único processo (por exemplo, o processonotepad).✓ Resposta:Get-Process -Name notepad | Format-List *Use
Format-Widepara exibir os nomes de todos os serviços em 3 colunas.✓ Resposta:Get-Service | Format-Wide Name -Column 3Explique por que o código a seguir está errado e corrija-o:
Get-Process | Format-Table | Where-Object {$_.CPU -gt 10}.✓ Resposta: O erro é queFormat-Tableconverte os objetos em objetos de formatação, então oWhere-Objectnão encontra a propriedadeCPU. A correção é mover o filtro antes da formatação:Get-Process | Where-Object {$_.CPU -gt 10} | Format-Table.