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.

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, DisplayName

O 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 Name

O 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.txt

Entender 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

  1. Use Get-Service para listar serviços, exibindo apenas as propriedades Name, Status e StartType em formato de tabela com ajuste automático de largura.

    ✓ Resposta:
    Get-Service | Format-Table Name, Status, StartType -AutoSize
  2. Crie uma propriedade calculada no Format-Table que 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)}}
  3. Use Format-List para exibir todos os detalhes de um único processo (por exemplo, o processo notepad).

    ✓ Resposta:
    Get-Process -Name notepad | Format-List *
  4. Use Format-Wide para exibir os nomes de todos os serviços em 3 colunas.

    ✓ Resposta:
    Get-Service | Format-Wide Name -Column 3
  5. Explique por que o código a seguir está errado e corrija-o: Get-Process | Format-Table | Where-Object {$_.CPU -gt 10}.

    ✓ Resposta: O erro é que Format-Table converte os objetos em objetos de formatação, então o Where-Object não encontra a propriedade CPU. A correção é mover o filtro antes da formatação: Get-Process | Where-Object {$_.CPU -gt 10} | Format-Table.

Referências