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 switch quando 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

  1. Escreva um script que receba um número do usuário e diga se é positivo, negativo ou zero.

✓ Resposta:
$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"
}
  1. 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.

✓ Resposta:
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
  1. 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+)

✓ Resposta:
$valor = 150
$resultado = ($valor -gt 100) ? "maior" : "menor"
Write-Host $resultado
  1. Escreva um script que verifique se um arquivo existe; se existir, exiba seu tamanho em bytes; caso contrário, exiba uma mensagem de erro.

✓ Resposta:
$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."
}
  1. 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.

✓ Resposta:
$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."
}

Referências