Hashtables
Nesta aula, exploramos as hashtables em PowerShell: como criá-las, acessar valores por chave, iterar sobre seus elementos e aplicá-las em casos reais como configurações e transformações de dados. A aula inclui exemplos práticos e exercícios com respostas.
Hashtables são estruturas de dados fundamentais em PowerShell que armazenam pares de chave-valor. Diferentemente de arrays, que usam índices numéricos, hashtables permitem acesso rápido aos valores por meio de chaves únicas, geralmente strings. Elas são extremamente úteis para organizar dados de forma semântica, como configurações, propriedades de objetos ou mapeamentos.
Nesta aula, veremos como criar hashtables, acessar e modificar seus elementos, percorrê-las com loops e aplicá-las em cenários práticos. Ao final, você será capaz de usar hashtables para tornar seus scripts mais legíveis e eficientes.
Criação
Para criar uma hashtable em PowerShell, usamos a sintaxe @{} com pares chave = valor separados por ponto e vírgula ou quebras de linha. As chaves podem ser strings (com ou sem aspas) ou números, e os valores podem ser de qualquer tipo, incluindo outras hashtables ou arrays.
Exemplo básico:
$pessoa = @{
Nome = "João"
Idade = 30
Cidade = "São Paulo"
}
Também é possível criar uma hashtable vazia e adicionar elementos depois:
$config = @{}
$config['host'] = 'localhost'
$config['port'] = 8080
Observe que usamos colchetes com a chave entre aspas para adicionar ou modificar valores. A mesma sintaxe serve para acesso.
Acesso por chave
Para acessar um valor, usamos a chave entre colchetes ou a notação de ponto (se a chave for uma string simples sem espaços). A notação de ponto é mais concisa, mas colchetes são necessários para chaves com caracteres especiais ou variáveis.
$pessoa = @{ Nome = "Maria"; Idade = 25 }
# Acesso por colchetes
$nome = $pessoa['Nome']
# Acesso por ponto (apenas chaves sem espaços)
$idade = $pessoa.Idade
Write-Host "$nome tem $idade anos"
Se a chave não existir, o acesso por colchetes retorna $null, enquanto a notação de ponto gera um erro. Para evitar erros, use o método ContainsKey() ou o operador -contains.
if ($pessoa.ContainsKey('Profissao')) {
$prof = $pessoa['Profissao']
} else {
Write-Host "Chave não existe"
}
Iteração
Para percorrer todos os pares chave-valor de uma hashtable, usamos o loop foreach sobre a propriedade Keys ou Values, ou diretamente sobre a hashtable (que retorna pares chave-valor como DictionaryEntry).
Exemplo com Keys:
$capitais = @{
Brasil = "Brasília"
França = "Paris"
Japão = "Tóquio"
}
foreach ($pais in $capitais.Keys) {
Write-Host "A capital de $pais é $($capitais[$pais])"
}
Exemplo iterando diretamente sobre a hashtable:
foreach ($item in $capitais.GetEnumerator()) {
Write-Host "Chave: $($item.Key), Valor: $($item.Value)"
}
O método GetEnumerator() retorna cada par como um objeto com propriedades Key e Value, útil para acessar ambos simultaneamente.
Casos de uso
Hashtables são versáteis e aparecem em muitos cenários:
- Configurações de script: Armazenar parâmetros em uma hashtable facilita a leitura e manutenção.
- Mapeamentos: Converter códigos em descrições, como status HTTP.
- Agrupamento de dados: Organizar objetos por uma chave comum, como departamentos de funcionários.
- Parâmetros splatting: Passar argumentos para cmdlets usando uma hashtable com o operador
@.
Exemplo de splatting:
$params = @{
Path = "C:\temp\arquivo.txt"
Destination = "C:\backup\"
Force = $true
}
Copy-Item @params
Isso torna o código mais limpo e reutilizável.
Boas práticas
- Use chaves consistentes (todas maiúsculas ou minúsculas) para evitar confusão, pois hashtables não diferenciam maiúsculas de minúsculas por padrão.
- Prefira a notação de ponto para acesso quando possível, mas use colchetes para chaves dinâmicas ou com espaços.
- Para hashtables grandes, considere usar
[ordered]@{}se precisar preservar a ordem de inserção (PowerShell 3.0+). - Evite modificar uma hashtable enquanto a itera; se necessário, copie as chaves primeiro.
Referências
- About Hash Tables - Microsoft Docs
- Everything you wanted to know about hashtables - PowerShell
- Hashtable - SS64 PowerShell Commands
- Understand how to use PowerShell hashtables - Scripting Blog
- About Splatting - Microsoft Docs
Exercícios
- Crie uma hashtable chamada
$alunocom as chaves Nome, Nota e Aprovado (booleano). Atribua valores de sua escolha e exiba o nome do aluno. - Acesse a chave "Telefone" da hashtable do exercício anterior. Use o método ContainsKey para verificar se ela existe e exiba uma mensagem adequada.
- Dada a hashtable
$frutas = @{ Maçã = 3; Banana = 5; Laranja = 2 }, use um loop para exibir cada fruta e sua quantidade. - Crie um script que use splatting com uma hashtable para chamar o cmdlet
New-Itemcriando um arquivo chamado "teste.txt" no diretório atual com o conteúdo "Olá, mundo!". - Converta a seguinte lista de objetos em uma hashtable onde a chave é o nome e o valor é a idade:
@(@{Nome="Carlos";Idade=22}, @{Nome="Fernanda";Idade=28}). Dica: use um loop para adicionar cada par a uma nova hashtable.
$aluno = @{
Nome = "Ana"
Nota = 8.5
Aprovado = $true
}
Write-Host $aluno.Nome
if ($aluno.ContainsKey('Telefone')) {
Write-Host "Telefone: $($aluno['Telefone'])"
} else {
Write-Host "Chave Telefone não existe."
}
$frutas = @{ Maçã = 3; Banana = 5; Laranja = 2 }
foreach ($chave in $frutas.Keys) {
Write-Host "$chave : $($frutas[$chave])"
}
$params = @{
Path = ".\teste.txt"
ItemType = "File"
Value = "Olá, mundo!"
Force = $true
}
New-Item @params
$lista = @(
@{Nome="Carlos";Idade=22},
@{Nome="Fernanda";Idade=28}
)
$hashIdades = @{}
foreach ($pessoa in $lista) {
$hashIdades[$pessoa.Nome] = $pessoa.Idade
}
$hashIdades