As estruturas de repetição são fundamentais para automatizar tarefas repetitivas. No PowerShell, além do tradicional for e foreach, temos o while, do-while e do-until que permitem executar um bloco de código enquanto (ou até que) uma condição seja verdadeira. Nesta aula, você aprenderá a sintaxe de cada uma, suas particularidades e como usar break e continue para controlar o fluxo da repetição.

while

O loop while executa um bloco de comandos repetidamente enquanto uma condição especificada for verdadeira. A condição é avaliada antes de cada iteração; se for $true, o bloco é executado; caso contrário, o loop termina.

Sintaxe:

while (<condição>) {
    <comandos>
}

Exemplo: exibir números de 1 a 5.

$i = 1
while ($i -le 5) {
    Write-Host $i
    $i++
}

Saída:

1
2
3
4
5

É importante garantir que a condição eventualmente se torne falsa para evitar loops infinitos. No exemplo acima, $i++ incrementa a variável até que $i -le 5 seja falso.

do-while e do-until

Diferente do while, os loops do-while e do-until executam o bloco de comandos pelo menos uma vez antes de avaliar a condição. A diferença entre eles está na lógica da condição:

  • do-while: executa enquanto a condição for verdadeira.
  • do-until: executa até que a condição se torne verdadeira (ou seja, continua enquanto for falsa).

Sintaxe:

do {
    <comandos>
} while (<condição>)

do {
    <comandos>
} until (<condição>)

Exemplo com do-while:

$i = 1
do {
    Write-Host $i
    $i++
} while ($i -le 5)

Exemplo com do-until:

$i = 1
do {
    Write-Host $i
    $i++
} until ($i -gt 5)

Ambos produzem a mesma saída (1 a 5). A diferença está na condição: no do-until, usamos $i -gt 5 (enquanto $i não for maior que 5, continua).

break e continue

Os comandos break e continue permitem controlar o fluxo dentro de loops.

  • break: sai imediatamente do loop, independentemente da condição.
  • continue: interrompe a iteração atual e vai para a próxima iteração (avalia novamente a condição).

Exemplo com break:

$i = 1
while ($true) {
    Write-Host $i
    $i++
    if ($i -gt 3) {
        break
    }
}

Saída: 1, 2, 3 (o loop é interrompido quando $i se torna 4).

Exemplo com continue:

for ($i = 1; $i -le 5; $i++) {
    if ($i -eq 3) {
        continue
    }
    Write-Host $i
}

Saída: 1, 2, 4, 5 (pula o número 3).

Casos de uso

Os loops while e do são ideais para situações onde o número de iterações não é conhecido antecipadamente. Exemplos:

  • Leitura de arquivos linha por linha até o final.
  • Esperar por um serviço ou recurso ficar disponível (ex.: aguardar um arquivo ser criado).
  • Menus interativos que repetem até o usuário escolher sair.
  • Processamento de dados em streams onde a condição de parada depende do conteúdo.

Exemplo prático: aguardar um processo terminar.

$process = Get-Process -Name 'notepad' -ErrorAction SilentlyContinue
while ($process) {
    Write-Host 'Aguardando o Bloco de Notas ser fechado...'
    Start-Sleep -Seconds 2
    $process = Get-Process -Name 'notepad' -ErrorAction SilentlyContinue
}
Write-Host 'Processo encerrado.'

Boas práticas

  • Sempre garanta que a condição do loop se tornará falsa em algum momento para evitar loops infinitos.
  • Use break com moderação; prefira condições claras de saída.
  • Em do-until, lembre-se de que a condição é avaliada no final, então o bloco sempre executa pelo menos uma vez.
  • Evite modificar a variável de controle dentro do bloco de forma imprevisível.

Referências

Exercícios

  1. Escreva um loop while que exiba os números pares de 2 a 10.

    ✓ Resposta:
    $i = 2
    while ($i -le 10) {
        Write-Host $i
        $i += 2
    }
  2. Usando do-while, crie um loop que leia a entrada do usuário até que ele digite "sair".

    ✓ Resposta:
    $input = ""
    do {
        $input = Read-Host "Digite algo (ou 'sair' para terminar)"
        Write-Host "Você digitou: $input"
    } while ($input -ne "sair")
  3. Reescreva o exercício 2 usando do-until.

    ✓ Resposta:
    $input = ""
    do {
        $input = Read-Host "Digite algo (ou 'sair' para terminar)"
        Write-Host "Você digitou: $input"
    } until ($input -eq "sair")
  4. Utilizando while e break, encontre o primeiro número maior que 100 que seja divisível por 7 e exiba-o.

    ✓ Resposta:
    $num = 101
    while ($true) {
        if ($num % 7 -eq 0) {
            Write-Host "Primeiro número > 100 divisível por 7: $num"
            break
        }
        $num++
    }
  5. Crie um loop for de 1 a 10 que use continue para pular os números ímpares e exiba apenas os pares.

    ✓ Resposta:
    for ($i = 1; $i -le 10; $i++) {
        if ($i % 2 -ne 0) {
            continue
        }
        Write-Host $i
    }