Usar formatação e filtragem

Concluído

Quando você trabalha com o PowerShell, a filtragem e a formatação são conceitos importantes a serem compreendidos, por alguns motivos. Primeiro, você deseja criar um pipeline que produza o resultado desejado. Em segundo lugar, você deseja fazer isso com eficiência. Em termos de como extrair os dados na rede e como garantir que o resultado seja algo com o qual se possa trabalhar.

Filtragem à esquerda

Em uma instrução de pipeline, a filtragem à esquerda significa filtrar os resultados desejados o mais rápido possível. Considere o termo à esquerda como início, porque as instruções do PowerShell são executadas da esquerda para a direita. A ideia é tornar a instrução rápida e eficiente, garantindo que o conjunto de dados em que você opera seja o menor possível. Esse princípio realmente entra em ação quando os comandos são operados em armazenamentos de dados maiores ou quando você está trazendo resultados pela rede.

Considere o seguinte instrução:

Get-Process | Select-Object Name | Where-Object Name -eq 'name-of-process'

Essa instrução primeiro recupera todos os processos no computador. Ela acaba formatando a resposta para que apenas a propriedade Name seja listada. Essa instrução não segue o princípio de filtragem à esquerda, porque opera em todos os processos, tenta formatar a resposta e faz a filtragem no final.

É melhor fazer a filtragem primeiro e, depois, a formatação, como na instrução a seguir.

Get-Process | Where-Object Name -eq 'name-of-process' | Select-Object Name

Geralmente, um cmdlet que oferece filtragem é mais eficiente do que usar Where-Object. Esta é uma versão mais eficiente da instrução anterior:

Get-Process -Name 'name-of-process' | Select-Object Name

Nesta versão, o parâmetro -Name faz a filtragem para você.

Formatação da forma correta, formatação como se fosse a última coisa a fazer

Enquanto a filtragem à esquerda significa filtrar algo o mais cedo possível em uma instrução, a formatação à direita significa formatar algo o mais tarde possível na instrução. OK, mas por que preciso formatar por último? A resposta é que os comandos de formato alteram a estrutura do objeto em que os resultados estão contidos para que os dados não sejam mais encontrados nas mesmas propriedades. Essa alteração afeta a capacidade de recuperar as informações desejadas usando comandos de pipe, Select-Object, ou fazendo um loop nos resultados com foreach.

A formatação destrói o objeto com o qual você está lidando. Faça a seguinte chamada, por exemplo:

Get-Process 'some process' | Select-Object Name, CPU | Get-Member

O tipo que retorna é System.Diagnostics.Process. Agora, adicione o formatador Format-Table da seguinte forma:

Get-Process 'some process' | Format-Table Name,CPU | Get-Member

Observando apenas os tipos retornados, você verá que está recebendo algo diferente:

TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData

Para esta lição, não importa quais são esses tipos. O importante é perceber que, quando você usa qualquer tipo de comando de formatação, os dados são diferentes. E quando ficam diferentes, eles podem não conter mais as colunas do seu interesse. Vamos ilustrar isso com um exemplo:

Get-Process 'some process' | Select-Object Name, Cpu

O comando anterior dá um resultado com as colunas Name e CPU.

Name       CPU
----       ---
zsh  1.2984395
zsh  0.2522047
zsh  0.2486375
zsh  0.2683466
zsh  0.2681874
zsh  1.6799438
zsh  0.2909816
zsh  0.7855272

Primeiro vamos usar a formatação e depois Select-Object para ilustrar o que pode acontecer se você não formatar por último:

Get-Process 'some process' | Format-Table Name,CPU | Select-Object Name, CPU

O resultado agora tem a seguinte aparência:

Name CPU
---- ---

Ele está vazio, pois Format-Table transformou o objeto que contém os resultados inserindo os dados em outras propriedades. Seus dados não desapareceram, apenas as suas propriedades. O comando anterior do PowerShell faz uma tentativa de localizar as propriedades, mas não consegue.

Os comandos de formatação devem ser o último recurso a ser usado em sua instrução porque eles se destinam a formatar bem tudo que vai entrar na apresentação na tela. A função deles não é filtrar ou classificar seus dados.

Comandos de formatação

Os cmdlets geralmente usados para formatar a saída são Format-Table e Format-List. Por padrão, a maioria dos cmdlets formata a saída como uma tabela. Se você não quiser que a saída exiba as propriedades em colunas, use o cmdlet Format-List para reformatá-las como uma lista.