Condicionais no PowerShell
LidoAula completa sobre condicionais no PowerShell, cobrindo if/elseif/else, operadores de comparação, o operador ternário do PS 7 e exemplos práticos. Inclui exercícios com respostas ocultas e referências oficiais.
Nesta aula, você vai dominar as estruturas condicionais no PowerShell, que permitem que seus scripts tomem decisões baseadas em condições lógicas. Começaremos com o tradicional if, elseif e else, depois exploraremos os operadores de comparação (que são a base de qualquer condição) e, por fim, veremos o operador ternário introduzido no PowerShell 7, que oferece uma sintaxe mais concisa para decisões simples.
Entender condicionais é essencial para escrever scripts que reagem a diferentes situações, como verificar se um arquivo existe, se um usuário tem permissão ou se um valor atende a um critério. Vamos abordar desde a sintaxe básica até boas práticas, com exemplos práticos que você pode testar imediatamente no seu terminal.
if/elseif/else
A estrutura if no PowerShell executa um bloco de código somente se uma condição especificada for verdadeira. A sintaxe é simples: if (condição) { código }. As chaves {} são obrigatórias, mesmo para uma única instrução, o que difere de algumas outras linguagens.
Quando você precisa testar múltiplas condições, pode encadear elseif (que é uma única palavra, sem espaço) e finalizar com else, que captura qualquer caso não atendido pelas condições anteriores. O PowerShell avalia as condições de cima para baixo e executa apenas o primeiro bloco cuja condição seja verdadeira; os demais são ignorados.
Exemplo básico:
$idade = 18
if ($idade -ge 18) {
Write-Host "Você é maior de idade."
}
else {
Write-Host "Você é menor de idade."
}
Exemplo com elseif para classificar notas:
$nota = 7.5
if ($nota -ge 9) {
Write-Host "Conceito A"
}
elseif ($nota -ge 7) {
Write-Host "Conceito B"
}
elseif ($nota -ge 5) {
Write-Host "Conceito C"
}
else {
Write-Host "Reprovado"
}
Perceba que a condição do elseif só é testada se as anteriores forem falsas. Isso permite criar lógicas complexas de forma legível.
Comparações
No PowerShell, os operadores de comparação são diferentes de linguagens como C# ou JavaScript. Em vez de símbolos como == e !=, usamos palavras-chave que começam com hífen: -eq (igual), -ne (diferente), -gt (maior que), -ge (maior ou igual), -lt (menor que), -le (menor ou igual). Esses operadores são case-insensitive por padrão, mas você pode usar variantes com c (por exemplo, -ceq) para tornar a comparação sensível a maiúsculas.
Além disso, o PowerShell oferece operadores específicos para strings, como -like (com curingas), -match (regex), e para testar se um valor está em uma coleção, como -contains e -in. Também é possível combinar condições com -and, -or e -not.
Exemplos de comparações:
$nome = "João"
if ($nome -eq "joão") {
Write-Host "Nomes iguais (ignora maiúsculas)"
}
$fruta = "banana"
if ($fruta -like "ban*") {
Write-Host "Começa com 'ban'"
}
$numero = 10
if ($numero -gt 5 -and $numero -lt 20) {
Write-Host "Número entre 5 e 20"
}
$lista = 1,2,3
if (3 -in $lista) {
Write-Host "3 está na lista"
}
Um detalhe importante: ao comparar números, o PowerShell converte automaticamente os tipos se necessário, mas é bom garantir que os tipos sejam compatíveis. Por exemplo, comparar uma string numérica com um número pode gerar resultados inesperados. Use -as ou conversões explícitas quando houver dúvida.
Operador ternário (PS 7)
O PowerShell 7 introduziu o operador ternário, que permite escrever uma estrutura condicional simples em uma única linha. A sintaxe é: condição ? valor_se_verdadeiro : valor_se_falso. Esse operador só está disponível no PowerShell 7 ou superior; em versões anteriores (como o Windows PowerShell 5.1), você precisará usar if tradicional.
O operador ternário é útil para atribuições rápidas ou para escolher entre dois valores. No entanto, evite usá-lo para lógicas complexas, pois pode prejudicar a legibilidade.
Exemplo:
$idade = 20
$status = if ($idade -ge 18) { "adulto" } else { "menor" }
# Ou usando o operador ternário (PS 7+):
$status = ($idade -ge 18) ? "adulto" : "menor"
Write-Host $status # Saída: adulto
Observe que o exemplo com if funciona em qualquer versão, enquanto o ternário exige PS 7. O operador ternário também pode ser usado em expressões dentro de strings interpoladas, mas cuidado com a precedência.
Exemplos
Vamos consolidar o aprendizado com alguns exemplos práticos que combinam os conceitos vistos.
Exemplo 1: Verificar se um processo está em execução
$processName = "notepad"
if (Get-Process -Name $processName -ErrorAction SilentlyContinue) {
Write-Host "O processo $processName está em execução."
} else {
Write-Host "O processo $processName não está em execução."
}
Exemplo 2: Calcular desconto baseado no valor da compra
$valorCompra = 250
if ($valorCompra -ge 500) {
$desconto = 0.2
} elseif ($valorCompra -ge 200) {
$desconto = 0.1
} else {
$desconto = 0
}
$valorFinal = $valorCompra * (1 - $desconto)
Write-Host "Valor final: R$ $valorFinal"
Exemplo 3: Usando o operador ternário para validar entrada
$resposta = Read-Host "Digite 'sim' para continuar"
$mensagem = ($resposta -eq "sim") ? "Continuando..." : "Operação cancelada."
Write-Host $mensagem
Esses exemplos mostram como as condicionais são aplicadas em situações do dia a dia. Lembre-se de testar cada trecho em seu console para ver os resultados.
Boas práticas
- Sempre use chaves
{}mesmo que o bloco tenha apenas uma linha, para evitar erros e melhorar a legibilidade. - Prefira nomes de variáveis descritivos e use indentação consistente.
- Evite condições muito longas; quebre em variáveis auxiliares se necessário.
- Em scripts maiores, considere usar
switchquando há muitas condições fixas, pois pode ser mais claro. - Teste os limites das suas condições (por exemplo, valores extremos) para garantir que a lógica esteja correta.
Exercícios
- Escreva um script que receba um número do usuário e diga se é positivo, negativo ou zero.
$num = [int](Read-Host "Digite um número")
if ($num -gt 0) {
Write-Host "Positivo"
} elseif ($num -lt 0) {
Write-Host "Negativo"
} else {
Write-Host "Zero"
}
- Crie uma função que receba uma idade e retorne se a pessoa é criança (0-12), adolescente (13-17), adulto (18-59) ou idoso (60+). Use
elseif.
function Get-FaixaEtaria {
param([int]$idade)
if ($idade -le 12) { return "criança" }
elseif ($idade -le 17) { return "adolescente" }
elseif ($idade -le 59) { return "adulto" }
else { return "idoso" }
}
# Teste:
Get-FaixaEtaria -idade 10
- Usando o operador ternário, atribua o valor "maior" ou "menor" a uma variável dependendo se um número é maior que 100. (PowerShell 7+)
$valor = 150
$resultado = ($valor -gt 100) ? "maior" : "menor"
Write-Host $resultado
- Escreva um script que verifique se um arquivo existe; se existir, exiba seu tamanho em bytes; caso contrário, exiba uma mensagem de erro.
$caminho = "C:\temp\meu_arquivo.txt"
if (Test-Path $caminho) {
$arquivo = Get-Item $caminho
Write-Host "Tamanho: $($arquivo.Length) bytes"
} else {
Write-Host "Arquivo não encontrado."
}
- Combine condições: escreva um script que receba dois números e diga se o primeiro é maior que o segundo E menor que 100, ou se são iguais.
$a = [int](Read-Host "Primeiro número")
$b = [int](Read-Host "Segundo número")
if ($a -eq $b) {
Write-Host "São iguais."
} elseif ($a -gt $b -and $a -lt 100) {
Write-Host "Primeiro é maior que o segundo e menor que 100."
} else {
Write-Host "Nenhuma condição atendida."
}