No universo do PowerShell, a compreensão de que cada saída de comando não é um mero texto, mas sim um objeto .NET estruturado, é fundamental. Essa característica confere uma capacidade incomparável de manipulação e análise de dados, transformando operações rotineiras em tarefas programáveis e altamente flexíveis.
Fundamentos dos Objetos no PowerShell
O que constitui um Objeto?
Um objeto é uma estrutura de dados que encapsula:
- Atributos (Propriedades): São as características ou dados intrínsecos ao objeto.
- Métodos: São as ações ou funções que o objeto pode executar.
Explorando a Estrutura de Objetos
Para visualizar as propriedades e métodos de um objeto, utilize o cmdlet Get-Member. Por exemplo, ao inspecionar processos:
Get-Process | Get-Member
Isto revelará detalhes como o tipo do objeto, seus métodos e as propriedades que ele expõe, permitindo uma interação programática precisa.
Cmdlets Chave para Manipulação de Objetos
1. Select-Object: O Seletor de Atributos
Este cmdlet é utilizado para escloher quais propriedades de um objeto serão exibidas, para limitar o número de objetos retornados ou para criar novas propriedades computadas.
Sintaxe Básica
Comando | Select-Object [-Property] <string[]> [-First <Int32>] [-Last <Int32>] [-Unique]
Parâmetros Notáveis
| Parâmetro | Descrição | Exemplo de Uso |
|---|---|---|
-Property |
Especifica as propriedades a serem selecionadas (aceita curingas *). |
Select-Object Nome, Idade |
-ExcludeProperty |
Exclui propriedades específicas da seleção. | Select-Object * -ExcludeProperty Versao |
-First |
Retorna os primeiros N objetos do pipeline. | Select-Object -First 3 |
-Last |
Retorna os últimos N objetos do pipeline. | Select-Object -Last 2 |
-Unique |
Filtra resultados para exibir apenas valores únicos. | Select-Object SistemaOperacional -Unique |
-Skip |
Ignora os primeiros N objetos. | Select-Object -Skip 5 |
| Propriedades Calculadas | Cria um novo atributo com base em uma expressão. Sintaxe: @{Name="...";Expression={...}} |
Select-Object @{Nome="UsoRAM(MB)";Expressao={[math]::Round($_.WorkingSet/1MB, 2)}} |
Exemplo Prático: Detalhes de Processos com Memória em MB
Get-Process |
Select-Object -First 7 -Property ProcessName, Id,
@{Name="UsoMemoriaMB";Expression={[math]::Round($_.WorkingSet/1MB, 2)}}
2. Where-Object: O Filtro Condicional
Este cmdlet é indispensável para filtrar coleções de objetos com base em critérios específicos, permitindo selecionar apenas os itens que atendem a uma condição.
Sintaxe Básica
Comando | Where-Object { $_.Propriedade -operador "Valor" }
Modos de Operação
| Formato | Descrição | Uso Recomendado |
|---|---|---|
| Bloco de Script | { $_.Propriedade -operador Valor } oferece controle total sobre a lógica. |
Condições complexas e múltiplas. |
| Forma Simplificada | Propriedade -operador Valor (PowerShell 3.0+) para filtros diretos. |
Condições simples e únicas. |
Operadores de Comparação Comuns
| Operador | Significado | Exemplo | Observações |
|---|---|---|---|
-eq |
Igual a | $_.Estado -eq "EmExecucao" |
Ignora maiúsculas/minúsculas. |
-ne |
Diferente de | $_.Prioridade -ne "Baixa" |
|
-gt, -lt |
Maior que, Menor que | $_.Tamanho -gt 100MB |
Para valores numéricos. |
-ge, -le |
Maior ou igual, Menor ou igual | $_.TempoExecucao -ge (New-TimeSpan -Hours 1) |
|
-like |
Correspondência com curingas | $_.NomeArquivo -like "*.log" |
Suporta * e ?. |
-match |
Correspondência com Expressões Regulares | $_.Caminho -match "C:\\Logs\\.*\.txt$" |
Permite padrões complexos. |
-notlike, -notmatch |
Negação dos operadores -like e -match. |
$_.Titulo -notlike "Relatorio*" |
|
-in, -notin |
Valor está/não está em uma coleção | $_.ID -in @(101, 105, 120) |
PowerShell 3.0+. |
Exemplo Avançado: Filtrando Serviços por Estado e Tipo de Inicialização
Get-Service |
Where-Object {
$_.Status -eq "Running" -and
$_.StartType -eq "Automatic" -and
$_.DisplayName -notlike "*Broker*"
}
3. Sort-Object: O Ordenador de Coleções
Este cmdlet organiza os objetos de uma coleção em uma ordem específica, seja ascendente ou descendente, com base em uma ou mais propriedades.
Sintaxe Básica
Comando | Sort-Object [-Property] <string> [-Descending]
Parâmetros Chave
| Parâmetro | Descrição | Exemplo |
|---|---|---|
-Property |
Propriedade(s) para ordenar (suporta múltiplas). | Sort-Object NomeDoProcesso, CPU |
-Descending |
Ordena em ordem decrescente (padrão é ascendente). | Sort-Object WorkingSet -Descending |
-CaseSensitive |
Ordena levando em conta maiúsculas/minúsculas. | Sort-Object Nome -CaseSensitive |
Exemplo: Classificação de Itens por Tipo e Tamanho
Get-ChildItem -Path "C:\Temp" |
Sort-Object @{Expression={$_.Extension}; Ascending=$true},
@{Expression={$_.Length}; Descending=$true}
4. ForEach-Object: O Iterador de Objetos
Permite que um bloco de script seja executado para cada objeto que passa pelo pipeline, sendo ideal para transformações ou ações individuais.
Sintaxe Essencial
Comando | ForEach-Object { Bloco de script }
Parâmetros Detalhados
| Parâmetro | Descrição | Exemplo |
|---|---|---|
-Process |
O bloco de script a ser executado para cada objeto (parâmetro principle). | ForEach-Object { $_.Nome } |
-Begin |
Bloco de script executado antes do processamento dos objetos. | ForEach-Object -Begin { $Contador = 0 } |
-End |
Bloco de script executado após o processamento de todos os objetos. | ForEach-Object -End { "Total processado: $Contador" } |
-MemberName |
(PS 4.0+) Invoca um método ou acessa uma propriedade em cada objeto. | ForEach-Object -MemberName GetType |
Exemplo Completo: Sumarizando o Consumo de Memória dos Processos
Get-Process |
ForEach-Object -Begin {
$TotalMemoria = 0
Write-Host "Iniciando a análise de processos..."
} -Process {
$TotalMemoria += $_.WorkingSet
Write-Host "Processo $($_.Name) consome: $([math]::Round($_.WorkingSet/1MB, 2)) MB"
} -End {
Write-Host "Uso total de memória pelos processos analisados: $([math]::Round($TotalMemoria/1GB, 2)) GB"
}
5. Group-Object: O Agrupador de Dados
Este cmdlet organiza objetos em grupos com base nos valores de uma ou mais propriedades, útil para sumarização e análise de dados.
Sintaxe Básica
Comando | Group-Object [-Property] <Object>
Parâmetros Chave
| Parâmetro | Descrição | Exemplo |
|---|---|---|
-Property |
A propriedade ou expressão para agrupamento. | Group-Object EstadoServico |
-AsHashTable |
Retorna uma tabela hash em vez de objetos de grupo. | Group-Object Prioridade -AsHashTable |
-NoElement |
Não inclui os objetos originais nos grupos, apenas as estatísticas. | Group-Object Empresa -NoElement |
Exemplo: Agrupando Processos por Prioridade e Somando o Consumo de CPU
Get-Process |
Group-Object @{Expression={$_.PriorityClass}} |
Select-Object Count, Name,
@{Name="CPUTotalSegundos";Expression={($_.Group | Measure-Object CPU -Sum).Sum}}
6. Measure-Object: O Analisador Estatístico
Calcula estatísticas como soma, média, mínimo, máximo, e contagem para propriedades numéricas de objetos.
Sintaxe Básica
Comando | Measure-Object [-Property] <string> [-Sum] [-Average] [-Maximum] [-Minimum]
Parâmetros de Estatística
| Parâmetro | Descrição | Exemplo |
|---|---|---|
-Property |
A propriedade numérica a ser medida. | Measure-Object -Property Length |
-Sum |
Calcula a soma dos valores. | Measure-Object -Sum |
-Average |
Calcula a média dos valores. | Measure-Object -Average |
-Maximum |
Determina o valor máximo. | Measure-Object -Maximum |
-Minimum |
Determina o valor mínimo. | Measure-Object -Minimum |
-StandardDeviation |
Calcula o desvio padrão (PS6+). | Measure-Object -StandardDeviation |
-AllStats |
Calcula todas as estatísticas disponíveis (PS6+). | Measure-Object -AllStats |
Exemplo Completo: Estatísticas de Tempo de CPU para Processos
Get-Process |
Measure-Object -Property CPU -Sum -Average -Minimum -Maximum -StandardDeviation |
Select-Object Count,
@{Name="CPU_Total_s";Expression={[math]::Round($_.Sum, 2)}},
@{Name="CPU_Media_s";Expression={[math]::Round($_.Average, 2)}},
Minimum, Maximum, StandardDeviation
Aplicações Práticas Combinando Cmdlets
Cenário 1: Top 3 Processos por Uso de CPU com Detalhes
Get-Process |
Where-Object {$_.CPU -gt 0} | # Filtrar apenas processos com uso de CPU
Sort-Object CPU -Descending |
Select-Object -First 3 -Property ProcessName, Id,
@{Name="SegundosCPU";Expression={[math]::Round($_.CPU, 2)}},
@{Name="UsoMemoriaMB";Expression={[math]::Round($_.WorkingSet/1MB, 2)}},
@{Name="Inicio";Expression={$_.StartTime.ToString("dd/MM/yyyy HH:mm:ss")}}
Cenário 2: Relatório de Tipos de Arquivos por Quantidade em um Diretório
$caminhoDiretorio = "C:\Users\Public\Documents"
$todosOsArquivos = Get-ChildItem -Path $caminhoDiretorio -Recurse -File
# Garantir que $total seja numérico e diferente de zero para o cálculo da porcentagem
$totalArquivos = $todosOsArquivos.Count
if ($totalArquivos -eq 0) {
Write-Warning "Nenhum arquivo encontrado no diretório especificado."
exit
}
$todosOsArquivos |
Group-Object Extension |
Sort-Object Count -Descending |
Select-Object @{Name="Extensao";Expression={$_.Name}},
Count,
@{Name="Porcentagem";Expression={[math]::Round(($_.Count / $totalArquivos) * 100, 2)}} |
Export-Csv -Path "C:\temp\RelatorioTiposArquivos.csv" -NoTypeInformation -Delimiter ";"
Cenário 3: Painel de Controle de Status de Serviços Agrupado
$servicos = Get-Service
$relatorioServicos = $servicos |
Group-Object Status, StartType -AsHashTable -AsString |
ForEach-Object {
[PSCustomObject]@{
Estado = $_.Key[0]
TipoInicializacao = $_.Key[1]
Quantidade = $_.Value.Count
ExemplosNomes = ($_.Value.DisplayName | Select-Object -First 2) -join ", "
}
}
$relatorioServicos | Sort-Object Estado, TipoInicializacao | Format-Table -AutoSize
$relatorioServicos | Export-Clixml -Path "C:\temp\ServicosDetalhes.xml"
Dicas para Otimização de Performance
1. Priorize a Filtragem Nativas
Sempre que possível, utilize parâmetros de filtro nativos dos cmdlets (geralmente -Filter, -Name, -Path) antes de recorrer ao Where-Object. Isso permite que o provedor de dados faça a filtragem no nível da fonte, reduzindo drasticamente o volume de dados transferidos no pipeline.
# Altamente eficiente: a filtragem ocorre na fonte
Get-ChildItem -Path "C:\Windows\System32" -Filter "*.dll" # ✅ Preferível
# Menos eficiente: todos os itens são recuperados antes da filtragem
Get-ChildItem -Path "C:\Windows\System32" | Where-Object {$_.Name -like "*.dll"} # ❌ Evitar quando há alternativa
# Eficiente: o cmdlet Get-Process filtra antes de gerar objetos
Get-Process -Name "explorer", "powershell" # ✅ Preferível
# Menos eficiente: todos os processos são recuperados e depois filtrados
Get-Process | Where-Object {$_.ProcessName -eq "explorer" -or $_.ProcessName -eq "powershell"} # ❌ Evitar
2. Seleção Antceipada de Propriedades
Selecione apenas as propriedades necessárias o mais cedo possível no pipeline. Isso diminui a "largura" dos objetos à medida que eles progridem, reduzindo o consumo de memória e o tempo de processamento em etapas posteriores.
Get-Service |
Select-Object Name, Status, DisplayName | # Reduz o tamanho do objeto para etapas futuras
Where-Object Status -eq "Running" |
Sort-Object Name
3. Processamento Paralelo (PowerShell 7+)
Para operações intensivas que podem ser divididas em tarefas independentes, o parâmetro -Parallel do ForEach-Object pode acelerar significativamente o processamento, especialmente em sistemas multi-core.
# Exemplo: Processar vários arquivos de log em paralelo
Get-ChildItem -Path "C:\Logs" -Filter "*.log" |
ForEach-Object -Parallel {
$conteudo = Get-Content $_.FullName -TotalCount 100 # Ler apenas as primeiras 100 linhas
if ($conteudo -match "ERRO CRITICO") {
Write-Host "Erro crítico encontrado em: $($_.Name)"
}
} -ThrottleLimit 4 # Limita o número de scripts executados simultaneamente
Tabela de Referência Rápida de Cmdlets Essenciais
| Cmdlet | Funcionalidade Principal | Parâmetros Frequentes | Nível de Uso |
|---|---|---|---|
Select-Object |
Escolhe e transforma propriedades de objetos, limita resultados. | -Property, -First, -Skip, @{Name;Expression} |
⭐⭐⭐⭐⭐ |
Where-Object |
Filtra objetos com base em condições lógicas. | -eq, -like, -match, -and, -or |
⭐⭐⭐⭐⭐ |
Sort-Object |
Ordena coleções de objetos por uma ou mais propriedades. | -Property, -Descending, -CaseSensitive |
⭐⭐⭐⭐ |
ForEach-Object |
Executa um bloco de script para cada objeto no pipeline. | -Process, -Begin, -End, -Parallel |
⭐⭐⭐⭐⭐ |
Group-Object |
Agrupa objetos por uma ou mais propriedades. | -Property, -AsHashTable, -NoElement |
⭐⭐⭐ |
Measure-Object |
Calcula estatísticas (soma, média, min, max) de propriedades numéricas. | -Sum, -Average, -Minimum, -Maximum, -AllStats |
⭐⭐⭐ |
Get-Member |
Exibe as propriedades e métodos de um objeto. | -MemberType, -Static |
⭐⭐⭐⭐ |