O cmdlet Measure-Object é uma ferramenta essencial no PowerShell para realizar cálculos estatísticos em coleções de dados. Ele permite contar objetos, somar valores numéricos, calcular médias, e encontrar valores máximos e mínimos, tudo de forma simples e integrada ao pipeline. Nesta aula, você aprenderá a utilizar seus parâmetros principais e aplicá-los em situações reais.

Dominar o Measure-Object é fundamental para quem precisa analisar dados rapidamente, seja contando arquivos em um diretório, calculando totais de vendas ou identificando extremos em conjuntos de números. Com ele, você evita loops manuais e torna seus scripts mais eficientes e legíveis.

Contagem

O parâmetro -Count é o mais básico e simples: ele conta quantos objetos são recebidos pelo pipeline. Isso é útil para saber, por exemplo, quantos arquivos existem em uma pasta, quantos processos estão em execução ou quantos serviços estão parados.

Exemplo: contar arquivos no diretório atual.

Get-ChildItem | Measure-Object -Count

O resultado será um objeto com a propriedade Count contendo o número total de itens. Você pode acessá-la diretamente:

(Get-ChildItem | Measure-Object -Count).Count

Se nenhum parâmetro for especificado, Measure-Object conta os objetos por padrão, mas é boa prática usar -Count explicitamente para clareza.

Soma e média

Para calcular a soma e a média de valores numéricos, utilize os parâmetros -Sum e -Average respectivamente. Esses parâmetros exigem que os objetos possuam uma propriedade numérica, que deve ser especificada com o parâmetro -Property.

Exemplo: somar e calcular a média dos tamanhos de arquivos em bytes.

Get-ChildItem | Measure-Object -Property Length -Sum -Average

O resultado terá as propriedades Sum e Average. Se você quiser apenas a soma ou a média, pode usar apenas um dos parâmetros.

Importante: a propriedade deve ser numérica; caso contrário, o PowerShell tentará converter, o que pode gerar erros. Para valores não numéricos, o cálculo é ignorado.

Estatísticas

Além de soma e média, o Measure-Object pode calcular o valor máximo (-Maximum) e mínimo (-Minimum). Esses parâmetros também exigem uma propriedade numérica e podem ser combinados entre si.

Exemplo: obter o maior e o menor processo em uso de memória (WorkingSet).

Get-Process | Measure-Object -Property WorkingSet -Maximum -Minimum

O resultado exibirá Maximum e Minimum com os respectivos valores. Você também pode combinar todos os parâmetros estatísticos de uma vez:

Get-ChildItem | Measure-Object -Property Length -Sum -Average -Maximum -Minimum

Isso retorna um único objeto com todas as estatísticas calculadas.

Casos de uso

O Measure-Object é amplamente utilizado em scripts de automação e análise. Alguns exemplos práticos:

  • Análise de logs: contar linhas de um arquivo de log que contêm uma palavra específica.
  • Monitoramento de desempenho: calcular a média de uso de CPU de processos em um intervalo.
  • Gerenciamento de arquivos: somar o tamanho total de arquivos de uma pasta para verificar limites de armazenamento.
  • Validação de dados: verificar se todos os valores em uma coluna estão dentro de um intervalo usando mínimo e máximo.

Exemplo: contar quantos serviços estão em execução.

Get-Service | Where-Object {$_.Status -eq 'Running'} | Measure-Object -Count

Exemplo: calcular a média de idade de usuários a partir de um CSV.

Import-Csv usuarios.csv | Measure-Object -Property Idade -Average

Esses exemplos mostram como o cmdlet se integra perfeitamente ao pipeline, permitindo análises rápidas sem a necessidade de loops complexos.

Boas práticas

Ao usar Measure-Object, lembre-se de que ele processa todos os objetos do pipeline de uma vez, o que pode consumir memória para coleções muito grandes. Para conjuntos enormes, considere usar filtros no pipeline (com Where-Object) antes de medir. Além disso, sempre verifique se a propriedade especificada existe e é numérica para evitar erros silenciosos.

Referências

Exercícios

  1. Conte quantos processos estão em execução no seu sistema usando Measure-Object.
  2. ✓ Resposta: Get-Process | Measure-Object -Count ou (Get-Process).Count.
  3. Calcule a soma total de memória (WorkingSet) de todos os processos em execução.
  4. ✓ Resposta: Get-Process | Measure-Object -Property WorkingSet -Sum.
  5. Encontre o arquivo com maior tamanho (Length) no diretório atual.
  6. ✓ Resposta: Get-ChildItem | Measure-Object -Property Length -Maximum.
  7. Calcule a média de idade de uma lista de pessoas (suponha que você tenha um array de objetos com a propriedade Idade).
  8. ✓ Resposta: $pessoas | Measure-Object -Property Idade -Average.
  9. Conte quantos serviços estão com Status 'Stopped' e calcule a soma de seus tempos de início (StartTime, se aplicável).
  10. ✓ Resposta:
    $servicosParados = Get-Service | Where-Object {$_.Status -eq 'Stopped'}
    $servicosParados | Measure-Object -Count
    # Para soma de StartTime (se existir):
    $servicosParados | Measure-Object -Property StartTime -Sum