Objetos .NET
Esta aula ensina como trabalhar com objetos .NET no PowerShell, cobrindo o acesso a classes, criação de instâncias com New-Object, uso de métodos estáticos e exemplos práticos para manipular objetos do sistema.
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 -StaticNew-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 $contentOutro 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')
$listMé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))
}
$listBoas 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
- New-Object (PowerShell)
- System.Object Class
- System.Math Class
- System.IO.File Class
- System.Net.WebClient Class
- Working with Objects in PowerShell
- System.Collections.ArrayList Class
Exercícios
Crie um script que use
New-Objectpara instanciar um objetoSystem.Randome 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"Utilize um método estático da classe
System.Mathpara 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"Crie um objeto
System.Collections.ArrayListe 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') $frutasUse o método estático
[System.IO.File]::ReadAllLinespara 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 }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!"