No PowerShell, tudo é um objeto, e cada objeto possui propriedades (dados) e métodos (ações). Para aproveitar ao máximo o potencial da linguagem, é essencial saber como descobrir e utilizar esses membros. Esta aula aborda o cmdlet Get-Member para inspecionar objetos, como acessar propriedades e invocar métodos, além de exemplos práticos que consolidam esses conceitos.

Dominar propriedades e métodos permite que você extraia informações específicas de comandos e manipule objetos de forma dinâmica, tornando seus scripts mais enxutos e poderosos.

Get-Member

O cmdlet Get-Member (ou seu alias gm) é a ferramenta principal para descobrir os membros de um objeto. Ele exibe as propriedades, métodos, eventos e outros membros disponíveis. Você pode usá-lo em pipeline ou diretamente com o parâmetro -InputObject.

Exemplo básico:

Get-Process | Get-Member

Isso lista todos os membros do objeto System.Diagnostics.Process. Para filtrar apenas propriedades, use -MemberType Property; para métodos, -MemberType Method. Também é possível buscar por nome com -Name.

Get-Process | Get-Member -MemberType Property | Select-Object Name, Definition

Acessando propriedades

Para acessar uma propriedade de um objeto, use a sintaxe de ponto: $objeto.Propriedade. Propriedades podem conter valores simples (string, int) ou outros objetos.

Exemplo: obter o nome do processo atual.

$processo = Get-Process -Id $pid
$processo.ProcessName

Para acessar propriedades aninhadas, encadeie os pontos: $objeto.Propriedade.SubPropriedade. Use Select-Object -ExpandProperty para extrair um array de valores de uma propriedade de uma coleção.

Get-Service | Select-Object -ExpandProperty Name

Chamando métodos

Métodos são ações que um objeto pode executar. São chamados com parênteses: $objeto.Metodo(). Alguns métodos aceitam argumentos.

Exemplo: matar um processo pelo método Kill().

$proc = Get-Process -Name notepad
$proc.Kill()

Métodos podem retornar valores. Use Get-Member para ver a definição e os parâmetros. Para métodos estáticos (da classe), use [Classe]::Metodo().

[System.Math]::Round(3.14159, 2)

Exemplos

Exemplo 1: Listar propriedades de um arquivo.

$arquivo = Get-Item C:\Windows\win.ini
$arquivo | Get-Member -MemberType Property
$arquivo.Length  # tamanho em bytes

Exemplo 2: Usar método para copiar um arquivo.

$origem = Get-Item "C:\temp\teste.txt"
$origem.CopyTo("C:\temp\teste_backup.txt")

Exemplo 3: Trabalhar com coleções – acessar propriedades de todos os processos.

Get-Process | ForEach-Object { $_.Name + " - " + $_.WorkingSet64 }

Exemplo 4: Chamar método em cada item de uma lista.

Get-Service | Where-Object { $_.Status -eq 'Stopped' } | ForEach-Object { $_.Start() }

Boas práticas

Sempre use Get-Member para explorar objetos desconhecidos. Prefira acessar propriedades diretamente em vez de usar expressões regulares para extrair dados de saída textual. Ao modificar objetos (ex.: iniciar serviços), tenha cuidado com privilégios e confirme ações com -WhatIf quando possível.

Referências

Exercícios

  1. Use Get-Process e Get-Member para listar apenas as propriedades do objeto processo. Quantas propriedades existem?

    ✓ Resposta: Execute Get-Process | Get-Member -MemberType Property | Measure-Object. O número exato pode variar conforme a versão do PowerShell, mas geralmente há dezenas de propriedades (ex.: 19 propriedades comuns).
  2. Acesse a propriedade Name do objeto retornado por Get-Date. Qual é o valor?

    ✓ Resposta: (Get-Date).Name retorna o dia da semana em formato string, por exemplo: "Monday".
  3. Chame o método ToShortDateString() em um objeto DateTime. Mostre o código e o resultado esperado.

    ✓ Resposta: (Get-Date).ToShortDateString() retorna a data no formato curto do sistema, ex.: "01/01/2023".
  4. Use Get-Service para obter o serviço Spooler de impressão. Em seguida, chame o método Stop() e depois Start() para reiniciá-lo. (Atenção: execute como administrador se necessário.)

    ✓ Resposta:
    $spooler = Get-Service -Name Spooler
    $spooler.Stop()
    Start-Sleep -Seconds 2
    $spooler.Start()
  5. Crie um objeto personalizado com New-Object PSObject e adicione uma propriedade Nome e um método DizerOla que imprime "Olá, [Nome]!". (Dica: use Add-Member com -MemberType ScriptMethod.)

    ✓ Resposta:
    $obj = New-Object PSObject
    Add-Member -InputObject $obj -MemberType NoteProperty -Name "Nome" -Value "Maria"
    Add-Member -InputObject $obj -MemberType ScriptMethod -Name "DizerOla" -Value { "Olá, " + $this.Nome + "!" }
    $obj.DizerOla()