Nesta aula, vamos explorar dois cmdlets fundamentais para manipulação de coleções no PowerShell: Sort-Object e Group-Object. Eles são frequentemente usados em pipelines para organizar e resumir dados, facilitando a análise e a geração de relatórios. Compreender esses cmdlets é essencial para qualquer profissional que trabalhe com automação e administração de sistemas Windows.

O Sort-Object permite ordenar objetos com base em uma ou mais propriedades, enquanto o Group-Object agrupa objetos que compartilham valores comuns. Combinados, eles oferecem um poder imenso para processar e visualizar informações de forma clara e concisa.

Ordenação

O cmdlet Sort-Object ordena objetos em ordem crescente ou decrescente com base em suas propriedades. Por padrão, a ordenação é crescente. Você pode especificar a propriedade pela qual deseja ordenar usando o parâmetro -Property.

Exemplo: suponha que temos uma lista de processos e queremos ordená-los pelo uso de memória (WorkingSet).

Get-Process | Sort-Object -Property WorkingSet

Para ordem decrescente, use o parâmetro -Descending.

Get-Process | Sort-Object -Property WorkingSet -Descending

Você também pode ordenar por propriedades que não são numéricas, como nomes.

Get-Service | Sort-Object -Property Status

Por múltiplas propriedades

É possível ordenar por mais de uma propriedade, fornecendo uma lista separada por vírgulas. O PowerShell ordena primeiro pela primeira propriedade e, em caso de empate, usa a segunda, e assim por diante.

Exemplo: ordenar processos primeiro pelo nome do processo (em ordem alfabética) e depois pelo uso de CPU (decrescente).

Get-Process | Sort-Object -Property Name, CPU -Descending

Note que o -Descending se aplica a todas as propriedades. Se precisar de ordens diferentes para cada propriedade, você pode usar uma hashtable com as chaves Expression e Ascending/Descending.

Get-Process | Sort-Object -Property @{Expression='Name'; Ascending=$true}, @{Expression='CPU'; Descending=$true}

Isso ordena pelo nome em ordem crescente e, para nomes iguais, pelo CPU em ordem decrescente.

Agrupamento

O cmdlet Group-Object agrupa objetos que possuem o mesmo valor para uma propriedade específica. Ele retorna objetos com as propriedades Count, Name e Group (contendo os objetos originais).

Exemplo: agrupar processos por nome do processo (para ver quantas instâncias de cada processo estão em execução).

Get-Process | Group-Object -Property ProcessName

Você pode usar o parâmetro -NoElement para omitir os objetos do grupo e mostrar apenas a contagem.

Get-Process | Group-Object -Property ProcessName -NoElement

Para agrupar por múltiplas propriedades, use uma expressão de script block ou uma hashtable, mas o mais comum é agrupar por uma única propriedade.

Contagem

O Group-Object já fornece a contagem de itens em cada grupo através da propriedade Count. Você pode ordenar os grupos pela contagem para identificar os grupos mais frequentes.

Exemplo: listar os 5 processos com mais instâncias em execução.

Get-Process | Group-Object -Property ProcessName | Sort-Object -Property Count -Descending | Select-Object -First 5

Para contar objetos sem agrupar (apenas o total), você pode usar o cmdlet Measure-Object.

Get-Process | Measure-Object

Ou contar objetos que atendem a uma condição:

(Get-Process | Where-Object {$_.CPU -gt 10}).Count

Essas técnicas são úteis para gerar relatórios resumidos.

Boas Práticas

  • Sempre especifique a propriedade a ser ordenada ou agrupada para evitar resultados inesperados.
  • Use -NoElement quando não precisar dos objetos originais, melhorando a performance.
  • Combine Group-Object com Sort-Object e Select-Object para análises rápidas.
  • Para ordenações complexas, utilize hashtables no parâmetro -Property.

Referências

Exercícios

  1. Liste todos os serviços do sistema, ordenados pelo nome do serviço em ordem decrescente.

    ✓ Resposta:
    Get-Service | Sort-Object -Property Name -Descending
  2. Agrupe os processos pelo nome do processo e exiba apenas o nome e a contagem, ordenados pela contagem em ordem decrescente.

    ✓ Resposta:
    Get-Process | Group-Object -Property ProcessName -NoElement | Sort-Object -Property Count -Descending
  3. Ordene os eventos do log de sistema (System) pelo ID do evento em ordem crescente e, em caso de empate, pela data/hora em ordem decrescente.

    ✓ Resposta:
    Get-WinEvent -LogName System | Sort-Object -Property Id, TimeCreated -Descending
  4. Conte quantos processos estão em execução com o nome "chrome" (assumindo que existam).

    ✓ Resposta:
    (Get-Process -Name chrome).Count
  5. Liste os 3 grupos de serviços mais comuns (pelo campo Status), exibindo o status e a quantidade.

    ✓ Resposta:
    Get-Service | Group-Object -Property Status | Sort-Object -Property Count -Descending | Select-Object -First 3