Propriedades calculadas são uma funcionalidade poderosa do PowerShell que permite criar novos valores ou transformar dados existentes na saída de comandos, sem modificar os objetos originais. Elas são definidas por meio de hashtables com chaves específicas, como Name e Expression, e podem ser usadas em cmdlets como Select-Object, Format-Table, Format-List e Sort-Object. Esta aula explora a sintaxe, os casos de uso e exemplos práticos para dominar esse recurso.

Hashtable @{Name=

Uma propriedade calculada é definida como uma hashtable (coleção de chave-valor) que especifica pelo menos duas chaves: Name (ou Label) e Expression. A chave Name define o nome da nova propriedade que aparecerá na saída. Por exemplo, @{Name='Tamanho em KB'; Expression={$_.Length / 1KB}} cria uma coluna chamada "Tamanho em KB" com o cálculo baseado na propriedade Length de cada objeto.

Além de Name e Expression, há outras chaves opcionais como FormatString, Alignment e Width, que permitem controlar a formatação da saída. A hashtable é passada como argumento para o parâmetro -Property de Select-Object ou para o parâmetro -Property de Format-Table, entre outros.

Expression=}

A chave Expression contém um bloco de script ({ }) que define o cálculo a ser realizado. Dentro do bloco, $_ representa o objeto atual sendo processado. Por exemplo, {$_.Size / 1MB} converte o tamanho para megabytes. É possível usar qualquer expressão válida do PowerShell, incluindo condicionais, cálculos e chamadas a métodos.

Exemplo simples: para obter o nome do arquivo em maiúsculas, use @{Name='Nome'; Expression={$_.Name.ToUpper()}}. A expressão pode ser complexa, como { if ($_.Length -gt 1MB) { 'Grande' } else { 'Pequeno' } }. Lembre-se de que a expressão é executada para cada objeto, então evite operações muito pesadas em grandes conjuntos de dados.

Em Select e Format

As propriedades calculadas são mais comumente usadas com Select-Object e Format-Table. No Select-Object, elas permitem criar novos objetos com propriedades personalizadas. Já no Format-Table, elas controlam a exibição sem alterar os objetos originais.

Exemplo com Select-Object:

Get-ChildItem | Select-Object Name, @{Name='Tamanho (KB)'; Expression={[math]::Round($_.Length / 1KB, 2)}}

Exemplo com Format-Table:

Get-Process | Format-Table Name, @{Name='Memória (MB)'; Expression={[math]::Round($_.WorkingSet / 1MB, 2)}}

Também é possível usar múltiplas propriedades calculadas e combiná-las com propriedades existentes.

Casos de uso

Propriedades calculadas são úteis em diversas situações:

  • Converter unidades (bytes para KB, MB, etc.)
  • Formatar datas e horas
  • Condensar informações (ex.: classificar arquivos como "Grande" ou "Pequeno")
  • Extrair partes de strings (ex.: domínio de um email)
  • Calcular totais ou porcentagens
  • Criar identificadores únicos ou concatenar propriedades

Elas evitam a necessidade de loops manuais e tornam o código mais limpo e eficiente. Por exemplo, para listar processos com uso de CPU em percentual, use:

Get-Process | Select-Object Name, @{Name='CPU %'; Expression={$_.CPU / (Get-Date -UFormat %s) * 100}}

Exemplos

Exemplo 1: Listar arquivos com tamanho formatado.

Get-ChildItem -File | Select-Object Name, @{Name='Tamanho'; Expression={ '{0:N2} KB' -f ($_.Length / 1KB) }}

Exemplo 2: Mostrar serviços com status legível.

Get-Service | Select-Object Name, @{Name='Status'; Expression={ if ($_.Status -eq 'Running') { 'Em execução' } else { 'Parado' } }}

Exemplo 3: Usar FormatString para alinhar números.

Get-Process | Format-Table Name, @{Name='Memória (MB)'; Expression={$_.WorkingSet / 1MB}; FormatString='N2'}

Exemplo 4: Propriedade calculada com múltiplas expressões.

Get-ChildItem | Select-Object Name, @{Name='Info'; Expression={ $_.Name + ' - ' + $_.Length + ' bytes' }}

Exemplo 5: Usar em Sort-Object para ordenar por valor calculado.

Get-ChildItem | Sort-Object @{Expression={$_.Length}; Descending=$true} | Select-Object Name, Length

Boas Práticas

  • Use nomes descritivos para Name para facilitar a leitura.
  • Evite expressões muito complexas; se necessário, crie uma função auxiliar.
  • Prefira Select-Object quando precisar armazenar o resultado em uma variável; use Format-Table apenas para exibição.
  • Teste a saída com conjuntos pequenos antes de aplicar a grandes volumes de dados.

Referências

Exercícios

  1. Crie um comando que liste todos os processos com as propriedades Name e WorkingSet (em megabytes, com duas casas decimais). Use Select-Object com uma propriedade calculada.

    ✓ Resposta:
    Get-Process | Select-Object Name, @{Name='WorkingSet (MB)'; Expression={[math]::Round($_.WorkingSet / 1MB, 2)}}
  2. Usando Format-Table, exiba os serviços com as colunas Name e Status, onde Status deve aparecer como "Running" ou "Stopped" em português.

    ✓ Resposta:
    Get-Service | Format-Table Name, @{Name='Status'; Expression={ if ($_.Status -eq 'Running') { 'Executando' } else { 'Parado' } }}
  3. Liste os 5 maiores arquivos no diretório atual, exibindo Nome e Tamanho em KB ordenados decrescentemente pelo tamanho. Use Sort-Object com uma propriedade calculada.

    ✓ Resposta:
    Get-ChildItem -File | Sort-Object @{Expression={$_.Length}; Descending=$true} -Top 5 | Select-Object Name, @{Name='Tamanho (KB)'; Expression={[math]::Round($_.Length / 1KB, 2)}}
  4. Crie uma propriedade calculada que retorne o nome do arquivo em letras maiúsculas e a extensão separadamente (duas colunas). Use Get-ChildItem.

    ✓ Resposta:
    Get-ChildItem -File | Select-Object @{Name='Nome Maiusculo'; Expression={$_.BaseName.ToUpper()}}, @{Name='Extensao'; Expression={$_.Extension}}
  5. Usando Format-List, exiba para cada processo as propriedades Name, Id e uma propriedade calculada chamada "Memória Total (MB)" que mostre a soma de WorkingSet e PrivateMemory em MB.

    ✓ Resposta:
    Get-Process | Format-List Name, Id, @{Name='Memória Total (MB)'; Expression={[math]::Round(($_.WorkingSet + $_.PrivateMemory) / 1MB, 2)}}