Select-Object
Esta aula aborda o cmdlet Select-Object do PowerShell, essencial para selecionar propriedades de objetos, criar propriedades calculadas, limitar resultados com -First e -Last, e expandir propriedades com -ExpandProperty. Através de exemplos práticos, você aprenderá a manipular e refinar a saída de comandos de forma eficiente.
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-Objectno final do pipeline para evitar processamento desnecessário. - Prefira
Select-Object -First 1em vez deGet-Process | Where-Object {...} | Select-Object -First 1para 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 SilentlyContinuese necessário.
Referências
- Documentação oficial do Select-Object
- Trabalhando com objetos no PowerShell
- Sobre pipelines no PowerShell
- Tudo sobre PSCustomObject
- Funções e scripts avançados
Exercícios
- Use
Get-ServiceeSelect-Objectpara exibir apenas o nome, status e tipo de inicialização dos serviços. - Crie uma propriedade calculada que mostre o tamanho de cada arquivo em kilobytes (KB) a partir de
Get-ChildItem. - Obtenha os 10 processos com maior uso de CPU (assuma a propriedade CPU).
- Use
Get-Processe-ExpandPropertypara listar todos os nomes de módulos carregados pelo processo atual (use$pid). - Combine
-Firste propriedade calculada: exiba os 5 primeiros processos, com nome e uma coluna calculada que mostre se o processo está respondendo (bool).
Get-Service | Select-Object Name, Status, StartType
Get-ChildItem | Select-Object Name, @{Name='TamanhoKB'; Expression={[math]::Round($_.Length / 1KB, 2)}}
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10
Get-Process -Id $pid | Select-Object -ExpandProperty Modules | Select-Object ModuleName
Get-Process | Select-Object -First 5 Name, @{Name='Respondendo'; Expression={$_.Responding}}