while e do
Esta aula aborda as estruturas de repetição while, do-while e do-until no PowerShell, explicando seu funcionamento, sintaxe e diferenças. Também cobre os comandos break e continue para controle de fluxo, além de casos de uso práticos.
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
breakcom 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
- Documentação oficial do PowerShell: about_While
- Documentação oficial do PowerShell: about_Do
- Documentação oficial do PowerShell: about_Break
- Documentação oficial do PowerShell: about_Continue
- Everything about loops (PowerShell)
Exercícios
-
Escreva um loop
whileque exiba os números pares de 2 a 10.✓ Resposta:$i = 2 while ($i -le 10) { Write-Host $i $i += 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") -
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") -
Utilizando
whileebreak, 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++ } -
Crie um loop
forde 1 a 10 que usecontinuepara 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 }