O cmdlet Select-Object é uma das ferramentas mais versáteis do PowerShell para manipular a saída de comandos. Ele permite selecionar propriedades específicas de objetos, criar novas propriedades com base em cálculos, limitar o número de objetos retornados e expandir propriedades que contêm coleções. Dominar o Select-Object é fundamental para extrair e formatar dados de forma precisa.

Selecionando propriedades

Por padrão, muitos cmdlets retornam objetos com um conjunto de propriedades. Com Select-Object, você pode especificar quais propriedades deseja ver, reduzindo a saída ao essencial. A sintaxe básica é Select-Object -Property Propriedade1, Propriedade2.

Por exemplo, ao listar processos, você pode selecionar apenas o nome e o uso de memória:

Get-Process | Select-Object -Property Name, WorkingSet64

Isso retorna uma tabela com duas colunas. Você também pode usar curingas, como * para todas as propriedades, ou [a-z]* para propriedades começando com uma letra.

Propriedades calculadas

Propriedades calculadas permitem criar novas propriedades baseadas em expressões. A sintaxe é uma hashtable com chaves Name (ou Label) e Expression. A expressão é um bloco de script que acessa o objeto atual via $_.

Exemplo: adicionar uma coluna que mostra o tamanho da memória em megabytes:

Get-Process | Select-Object Name, @{Name='Memória (MB)'; Expression={[math]::Round($_.WorkingSet64 / 1MB, 2)}}

Isso exibe o nome e a memória formatada. Você pode usar várias propriedades calculadas e misturá-las com propriedades existentes.

-First e -Last

Os parâmetros -First e -Last limitam a quantidade de objetos retornados. -First pega os primeiros N objetos, e -Last os últimos N. São úteis para amostragem ou quando você só precisa de um subconjunto.

Exemplo: obter os 5 processos com maior uso de memória:

Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5

E os 3 mais antigos (últimos) do log de eventos:

Get-EventLog -LogName System -Newest 100 | Select-Object -Last 3

Esses parâmetros são processados antes da seleção de propriedades, então você pode combiná-los.

-ExpandProperty

O parâmetro -ExpandProperty é usado para extrair o valor de uma propriedade que contém uma coleção ou um objeto complexo, retornando apenas os itens dessa coleção. Isso é útil quando você quer trabalhar diretamente com os elementos internos.

Exemplo: obter a lista de módulos de um processo:

Get-Process -Id $pid | Select-Object -ExpandProperty Modules

Isso retorna os objetos Module diretamente, em vez de uma propriedade Modules. Você também pode expandir uma propriedade de string simples, mas o efeito é o mesmo que selecioná-la (a diferença é que o resultado não será um objeto com propriedade, mas o valor puro).

Outro exemplo: obter uma lista de nomes de serviços:

Get-Service | Select-Object -ExpandProperty Name

Isso retorna um array de strings, não objetos Service. Útil para passar para outros comandos.

Boas práticas

  • Use Select-Object no final do pipeline para evitar processamento desnecessário.
  • Prefira Select-Object -First 1 em vez de Get-Process | Where-Object {...} | Select-Object -First 1 para eficiência.
  • Propriedades calculadas podem ser reutilizadas definindo hashtables em variáveis.
  • Cuidado ao expandir propriedades: se a propriedade for nula, ocorrerá um erro. Use -ErrorAction SilentlyContinue se necessário.

Referências

Exercícios

  1. Use Get-Service e Select-Object para exibir apenas o nome, status e tipo de inicialização dos serviços.
  2. ✓ Resposta:
    Get-Service | Select-Object Name, Status, StartType
  3. Crie uma propriedade calculada que mostre o tamanho de cada arquivo em kilobytes (KB) a partir de Get-ChildItem.
  4. ✓ Resposta:
    Get-ChildItem | Select-Object Name, @{Name='TamanhoKB'; Expression={[math]::Round($_.Length / 1KB, 2)}}
  5. Obtenha os 10 processos com maior uso de CPU (assuma a propriedade CPU).
  6. ✓ Resposta:
    Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
  7. Use Get-Process e -ExpandProperty para listar todos os nomes de módulos carregados pelo processo atual (use $pid).
  8. ✓ Resposta:
    Get-Process -Id $pid | Select-Object -ExpandProperty Modules | Select-Object ModuleName
  9. Combine -First e propriedade calculada: exiba os 5 primeiros processos, com nome e uma coluna calculada que mostre se o processo está respondendo (bool).
  10. ✓ Resposta:
    Get-Process | Select-Object -First 5 Name, @{Name='Respondendo'; Expression={$_.Responding}}