O PowerShell é construído sobre o .NET Framework, o que permite acessar e manipular objetos .NET diretamente no shell. Essa integração é uma das características mais poderosas do PowerShell, pois possibilita utilizar bibliotecas e classes do .NET para realizar tarefas complexas que vão além dos cmdlets nativos. Nesta aula, você aprenderá como instanciar objetos .NET, invocar métodos estáticos e aplicar esses conceitos em exemplos práticos.

Dominar objetos .NET expande significativamente suas capacidades como profissional de automação, permitindo interagir com o sistema operacional, arquivos, rede, e muito mais de forma programática. Vamos explorar desde o básico até exemplos que você pode usar no dia a dia.

Acessando classes .NET

No PowerShell, as classes .NET são acessadas usando seus nomes completos (namespace + nome da classe). O namespace é uma forma de organizar classes relacionadas. Por exemplo, a classe System.Math pertence ao namespace System. Você pode usar a sintaxe [nome_da_classe] para referenciar uma classe .NET. O PowerShell automaticamente carrega os assemblies necessários, mas para classes em assemblies não carregados, você pode usar Add-Type -AssemblyName.

Para descobrir membros de uma classe, use o cmdlet Get-Member. Por exemplo, [System.Math] | Get-Member -Static lista todos os membros estáticos da classe Math. Lembre-se de que o PowerShell diferencia membros de instância (que exigem um objeto) de membros estáticos (que pertencem à classe).

# Acessando a classe System.Math
[System.Math] | Get-Member -Static

# Acessando a classe System.IO.File
[System.IO.File] | Get-Member -Static

New-Object

O cmdlet New-Object é usado para criar uma nova instância de uma classe .NET. A sintaxe básica é New-Object -TypeName NomeDaClasse -ArgumentList Argumentos. O parâmetro -ArgumentList aceita uma lista de argumentos separados por vírgula, que são passados para o construtor da classe. Você também pode usar a sintaxe abreviada New-Object NomeDaClasse Argumentos.

Exemplo: criar um objeto System.Net.WebClient para baixar conteúdo da web. Primeiro, instanciamos o objeto e depois chamamos métodos como DownloadString.

# Criando um objeto WebClient
$webClient = New-Object System.Net.WebClient
$content = $webClient.DownloadString('https://example.com')
Write-Host $content

Outro exemplo comum é criar um objeto System.Collections.ArrayList para trabalhar com listas dinâmicas.

# Criando um ArrayList
$list = New-Object System.Collections.ArrayList
$list.Add('Item 1')
$list.Add('Item 2')
$list

Métodos estáticos

Métodos estáticos são chamados diretamente na classe, sem necessidade de criar um objeto. No PowerShell, você usa a sintaxe [NomeDaClasse]::NomeDoMetodo(Argumentos). Isso é útil para operações utilitárias, como manipulação de strings, matemática, acesso a arquivos, etc.

Exemplos de métodos estáticos comuns:

  • [System.Math]::Sqrt(16) – retorna 4
  • [System.IO.File]::ReadAllText('C:\arquivo.txt') – lê todo o conteúdo de um arquivo
  • [System.Environment]::UserName – obtém o nome do usuário atual (propriedade estática)
# Métodos estáticos
$raiz = [System.Math]::Sqrt(144)
Write-Host "Raiz quadrada de 144 é $raiz"

$conteudo = [System.IO.File]::ReadAllText('C:\temp\exemplo.txt')
Write-Host $conteudo

$usuario = [System.Environment]::UserName
Write-Host "Usuário: $usuario"

Exemplos

Vamos ver exemplos práticos combinando os conceitos. Primeiro, um script que cria um objeto System.Net.WebClient para baixar uma página e salvá-la em disco usando métodos estáticos de System.IO.File.

# Exemplo 1: Baixar e salvar conteúdo web
$webClient = New-Object System.Net.WebClient
$url = 'https://www.google.com'
$html = $webClient.DownloadString($url)
[System.IO.File]::WriteAllText('C:\temp\google.html', $html)
Write-Host "Página salva com sucesso!"

Segundo exemplo: usar New-Object para criar um objeto System.Diagnostics.Process e iniciar um processo, depois usar métodos estáticos para obter informações do sistema.

# Exemplo 2: Trabalhando com processos
$process = New-Object System.Diagnostics.Process
$process.StartInfo.FileName = 'notepad.exe'
$process.Start()

# Obtendo informações do sistema com métodos estáticos
$memoria = [System.Environment]::WorkingSet
Write-Host "Memória usada pelo processo atual: $memoria bytes"

Terceiro exemplo: criar uma lista de números aleatórios usando System.Random e System.Collections.ArrayList.

# Exemplo 3: Lista de números aleatórios
$random = New-Object System.Random
$list = New-Object System.Collections.ArrayList
for ($i = 0; $i -lt 10; $i++) {
    $list.Add($random.Next(1, 100))
}
$list

Boas práticas e observações finais

Ao trabalhar com objetos .NET, lembre-se de que muitos objetos consomem recursos (como conexões de rede ou arquivos abertos). Sempre que possível, libere esses recursos chamando o método Dispose() ou usando o bloco using (disponível no PowerShell 5+). Além disso, prefira usar cmdlets nativos do PowerShell quando existirem, pois eles são mais consistentes e geralmente mais seguros. No entanto, para funcionalidades não cobertas por cmdlets, os objetos .NET são uma excelente alternativa.

Outra dica: explore a documentação do .NET para descobrir classes úteis. Por exemplo, System.Security.Cryptography para criptografia, System.Net.Mail para envio de e-mails, e System.Data para acesso a bancos de dados. O PowerShell permite que você use praticamente qualquer classe .NET disponível no sistema.

Referências

Exercícios

  1. Crie um script que use New-Object para instanciar um objeto System.Random e gere um número aleatório entre 1 e 100, exibindo-o no console.

    ✓ Resposta:
    $random = New-Object System.Random
    $numero = $random.Next(1, 101)
    Write-Host "Número aleatório: $numero"
  2. Utilize um método estático da classe System.Math para calcular a potência de 2 elevado a 10 e exiba o resultado.

    ✓ Resposta:
    $resultado = [System.Math]::Pow(2, 10)
    Write-Host "2^10 = $resultado"
  3. Crie um objeto System.Collections.ArrayList e adicione três nomes de frutas. Depois, exiba a lista.

    ✓ Resposta:
    $frutas = New-Object System.Collections.ArrayList
    $frutas.Add('Maçã')
    $frutas.Add('Banana')
    $frutas.Add('Laranja')
    $frutas
  4. Use o método estático [System.IO.File]::ReadAllLines para ler todas as linhas de um arquivo de texto e exiba-as uma por uma.

    ✓ Resposta:
    $linhas = [System.IO.File]::ReadAllLines('C:\temp\exemplo.txt')
    foreach ($linha in $linhas) {
        Write-Host $linha
    }
  5. Crie um script que instancie um objeto System.Net.WebClient, baixe o conteúdo da URL 'https://www.example.com' e salve em um arquivo usando [System.IO.File]::WriteAllText.

    ✓ Resposta:
    $webClient = New-Object System.Net.WebClient
    $html = $webClient.DownloadString('https://www.example.com')
    [System.IO.File]::WriteAllText('C:\temp\example.html', $html)
    Write-Host "Arquivo salvo!"