Select-Object
A aula aborda o cmdlet Select-Object do PowerShell, que permite selecionar propriedades de objetos, criar propriedades calculadas, limitar a quantidade de itens com -First e -Last, e expandir propriedades com -ExpandProperty. São apresentados exemplos práticos e exercícios para fixação.
O cmdlet Select-Object é uma ferramenta essencial no PowerShell para filtrar e transformar objetos. Ele permite selecionar propriedades específicas de objetos passados pelo pipeline, criar novas propriedades calculadas e limitar o número de objetos processados. Nesta aula, exploraremos suas principais funcionalidades.
Com Select-Object, você pode extrair apenas as informações relevantes de um conjunto de dados, facilitando a leitura e o processamento posterior. Além disso, é possível modificar a estrutura dos objetos adicionando propriedades calculadas, o que é útil para relatórios e análises.
Selecionando propriedades
A forma mais básica de uso do Select-Object é especificar quais propriedades de um objeto você deseja manter. Por exemplo, ao listar processos, você pode selecionar apenas Name, Id e CPU.
Get-Process | Select-Object Name, Id, CPUIsso cria novos objetos contendo apenas essas três propriedades. Você também pode usar curingas, como * para todas as propriedades, ou [a-z]* para propriedades começando com letras minúsculas.
Propriedades calculadas
Propriedades calculadas permitem criar novas propriedades baseadas em expressões. A sintaxe utiliza um hashtable com chaves Name (ou Label) e Expression. Por exemplo, para exibir o nome do processo em maiúsculas:
Get-Process | Select-Object Name, @{Name='NameUpper'; Expression={$_.Name.ToUpper()}}Você pode usar qualquer scriptblock na expressão, acessando o objeto atual via $_. Isso é útil para formatação, cálculos e transformações.
-First e -Last
Os parâmetros -First e -Last limitam a quantidade de objetos retornados. -First retorna os primeiros N objetos, enquanto -Last retorna os últimos N. São úteis para amostras ou para pegar os top/últimos itens de uma lista ordenada.
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5O exemplo acima retorna os 5 processos que mais consomem CPU. Combinado com Sort-Object, é uma forma rápida de obter rankings.
-ExpandProperty
O parâmetro -ExpandProperty é usado quando uma propriedade contém uma coleção de objetos. Ele "expande" essa propriedade, retornando cada elemento da coleção como um objeto separado no pipeline. Por exemplo, o cmdlet Get-Service retorna serviços, e a propriedade ServicesDependedOn é uma lista de strings. Para obter cada dependência como um objeto individual:
Get-Service | Select-Object -ExpandProperty ServicesDependedOnIsso é útil para processar cada item da coleção separadamente. Se a propriedade não for uma coleção, -ExpandProperty retorna o valor da propriedade diretamente, sem encapsulá-lo em um objeto.
Boas práticas
Use Select-Object para reduzir a quantidade de dados transmitidos no pipeline, melhorando a performance. Prefira selecionar propriedades específicas em vez de usar * desnecessariamente. Ao criar propriedades calculadas, mantenha as expressões simples e legíveis.
Referências
- Documentação oficial do Select-Object
- Tudo sobre Select-Object (PowerShell Deep Dive)
- Trabalhando com objetos no PowerShell
- Select-Object no SS64
- Usando Select-Object para criar propriedades calculadas
Exercícios
- Exercício 1: Liste todos os processos em execução, mas selecione apenas as propriedades
Name,IdeWorkingSet(memória em bytes). - Exercício 2: Crie uma propriedade calculada chamada
CPU_Minutesque exiba o tempo de CPU em minutos (dividindo por 60). UseGet-Processcomo base. - Exercício 3: Obtenha os 3 serviços que mais tempo estão em execução (use
Get-Service? Na verdade, serviços não têm propriedade de tempo. UseGet-Processe selecione os 3 com maiorWorkingSet). - Exercício 4: Use
-ExpandPropertypara listar todos os módulos carregados por um processo específico (por exemplo, o processopowershell). Dica: useGet-Process -Name powershell | Select-Object -ExpandProperty Modules. - Exercício 5: Crie um comando que retorne o último evento do log do sistema (
Get-WinEvent -LogName System) e exiba apenas a mensagem e o tempo de criação, mas com o tempo formatado como string curta (useGet-Date).
Get-Process | Select-Object Name, Id, WorkingSetGet-Process | Select-Object Name, @{Name='CPU_Minutes'; Expression={$_.CPU / 60}}Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 3 Name, WorkingSetGet-Process -Name powershell | Select-Object -ExpandProperty ModulesGet-WinEvent -LogName System -MaxEvents 1 | Select-Object @{Name='Time'; Expression={Get-Date $_.TimeCreated -Format 'yyyy-MM-dd HH:mm:ss'}}, Message