PowerShell For Loop: Um Guia Abrangente

Quando você usa scripts do PowerShell para gerenciar sistemas ou processar tarefas em massa, sem dúvida você encontrará a necessidade de usar uma estrutura de loop como parte de seus scripts. Existem muitos tipos de loops disponíveis no PowerShell, e um deles é o loop for. O loop for do PowerShell pode executar rapidamente o mesmo conjunto de comandos em vários itens e produzir resultados consistentes.

Neste artigo, você aprenderá o que é o loop for no PowerShell, entenderá sua sintaxe e o que compõe uma declaração de loop for. Você também aprenderá com os exemplos algumas das diferentes maneiras que você pode usar o loop for.

Compreendendo a Declaração e os Espaços Reservados do Loop for do PowerShell

O loop for do PowerShell é comumente usado quando o número de vezes (contagem de iteração) que um comando ou processo precisa ser executado já é conhecido. Um exemplo seria quando você deseja processar apenas um subconjunto de valores em uma matriz (por exemplo, processar apenas 10 de um número X de itens).

O uso de um loop for dá mais controle sobre limites e condições de quando o código deve sair. Isso é comparado com o loop foreach ou o cmdlet ForEach-Object, onde a iteração pára após o último item na coleção ter sido processado.

Abaixo está a sintaxe da declaração de loop for para sua referência.

for (<Initial iterator value>; <Condition>; <Code to repeat>)
{
    <Statement list>
}

Como você pode ver na sintaxe acima, a declaração de loop for do PowerShell pode ser dividida em quatro espaços reservados que você deve conhecer. Estes são os espaços reservados Inicial, Condição, Repetir e Lista de Declarações.

  • O marcador Inicial é onde você especifica um valor inicial. Este valor é lido apenas uma vez pela declaração. Normalmente, os scripters atribuem a esta variável um valor de zero.
  • O marcador Condição especifica o limite ou condição para determinar se o loop deve continuar executando ou encerrar. A expressão usada neste marcador avalia como verdadeira.
  • O marcador Repetir aceita vários comandos. Os comandos fornecidos neste marcador são executados após cada repetição do loop e antes do Condição ser reavaliado. Os scripters geralmente usam isso para fornecer uma expressão para incrementar ou decrementar o valor no marcador Inicial.
  • Finalmente, o marcador Lista de Declarações é onde o código principal que você pretende executar será colocado. O código dentro deste marcador é repetido em um loop até que o Condição retorne um valor de $False.

Compreendendo o Fluxo de Execução do PowerShell For Loop

Para entender melhor como o loop for do PowerShell funciona, é preciso se familiarizar com o seu fluxo de execução. Um loop for é inicialmente um processo de quatro etapas, que se torna um processo de três etapas após a execução inicial. Para uma explicação mais detalhada, continue lendo o algoritmo abaixo.

ETAPA 1

No início da declaração do loop for, o valor Inicial é lido e armazenado na memória.

Exemplo: $num = 0

ETAPA 2

A declaração de loop for avalia o resultado booleano da expressão dentro do espaço reservado Condição. Se o resultado for $false, o loop for é encerrado. Se o resultado for $true, então o loop for continua para o próximo passo.

Exemplo: $num -lt 10

PASSO 3

O PowerShell executa o código dentro do espaço reservado Lista de declarações. Pode haver um ou mais comandos, blocos de script ou funções.

Exemplo: "Eu conto $num "

PASSO 4

Neste passo, a expressão no espaço reservado Repetir é executada, o que atualizará o valor atual do espaço reservado Inicial. Em seguida, o fluxo voltará para o Passo 2.

Exemplo: $num++

Usando o Loop For do PowerShell (Exemplos)

As próximas seções serão alguns exemplos de como usar o loop for de várias maneiras. Esses exemplos podem ou não ter uso prático ou real como estão. Mas as técnicas que você aprenderá podem orientá-lo no uso do loop for, caso você encontre uma necessidade real de fazê-lo.

Agora que você entende como o loop for funciona, é hora de ver como tudo se junta usando código básico.

Obtendo uma Sequência de Números

O código abaixo exibe a string "Eu conto $num" repetidamente no console, começando de 1 até que o valor de $num alcance 10.

for ($num = 1 ; $num -le 10 ; $num++){    "I count $num"}

Quando você copia o código acima e cola-o em sua sessão do PowerShell para executá-lo, a captura de tela abaixo mostra o resultado.

For loop example to display numbers less than 10

Concatenando Strings

A declaração do loop for não se limita apenas a expressões matemáticas como adição, subtração ou multiplicação. Ele também pode ser usado para concatenar valores de string.

O exemplo abaixo continuará repetindo a letra “x” com cada linha contendo um caractere a mais que a anterior até que o número de caracteres na linha atinja 30.

Como você pode ver, o valor de $x foi iniciado com '' que contém zero caracteres. O limite baseado na condição é até quando o número de caracteres contidos no valor de $x atinge 30. Após cada iteração, mais uma letra “x” é acrescentada ao valor de $x.

for ($x='' ;$x.length -le 30;$x=$x+'x'){
    Write-Host $x
    Start-Sleep -Milliseconds 20
}

A saída abaixo mostra o resultado esperado quando o código acima é executado no PowerShell.

String concatenation example using For Loop

Concatenando Strings com Múltiplas Expressões Iniciais e de Repetição

Os espaços reservados Inicial e Repetir na declaração do loop for podem aceitar múltiplas expressões.

Usando o código do exemplo anterior acima, o código pode ser modificado para adicionar uma nova expressão no espaço reservado Repetir para escolher uma cor aleatória. A cor aleatória será então usada como a cor de primeiro plano da string a ser exibida no console.

Como você pode ver na primeira linha, um array contendo nomes de cores é definido. A operação do loop for escolherá aleatoriamente um nome de cor deste array.

Perceba que os espaços reservados Inicial e Repetir agora têm duas expressões. Cada expressão é envolvida em parênteses e separada por uma vírgula.

$colors = @("Green","Cyan","Red","Magenta","Yellow","White")
for (($x=''),($fgcolor = $colors | Get-Random) ;$x.length -le 30;($x=$x+'x'),($fgcolor = $colors | Get-Random)){
    Write-Host $x -ForegroundColor $fgcolor
    Start-Sleep -Milliseconds 20
}

Uma vez que o código modificado é executado no PowerShell, o resultado esperado é mostrado abaixo.

String concatenation example using For Loop

Exibindo Progresso

Provavelmente, o uso mais comum do loop for é para mostrar indicadores de progresso. Isso é principalmente empregado ao executar tarefas para itens em massa que podem levar tempo para serem completados. Como, por exemplo, criar um relatório para todos os tamanhos de caixa de correio na sua organização Exchange, ou atualizar atributos de múltiplos usuários em Active Directory.

O código de exemplo abaixo mostra a maneira básica de exibir o progresso de 1 a 100%. Como você verá, o valor inicial do $counter é 1, e a condição indica que esse loop será executado até que o valor do $counter atinja 100.

for ($counter = 1; $counter -le 100; $counter++ )
{
		# ADICIONE SEU CÓDIGO AQUI
    Write-Progress -Activity "Update Progress" -Status "$counter% Complete:" -PercentComplete $counter;
}

Quando você executa o código acima no PowerShell, você deve ver uma saída similar, como mostrado abaixo.

Progress counter driven by for loop

Exibindo um Temporizador Regressivo

O próximo código mostra como usar o loop for para exibir um temporizador regressivo. Esse temporizador regressivo mostra apenas os segundos restantes, começando de 10.

Se você quiser mudar o número inicial, você só precisa mudar o valor da variável $seconds no espaço Inicial.

for ($seconds=10; $seconds -gt -1; $seconds--) {
    Write-Host -NoNewLine ("`rseconds remaining: " + ("{0:d4}" -f $seconds))
    Start-Sleep -Seconds 1
}

Executar o código acima no PowerShell resultará na amostra de saída abaixo.

A countdown timer that is driven by for loop

Exibindo um Temporizador Regressivo (Loop For Aninhado)

E se você quiser exibir o cronômetro regressivo usando o formato minutos:segundos? O loop aninhado pode ser usado para isso. Um loop aninhado é simplesmente definido como um loop dentro de outro loop, e assim por diante.

O código de exemplo abaixo contém duas instruções de loop.

O primeiro loop lida com a contagem regressiva da parte minuto do cronômetro. Como você pode ver, há uma variável $minutes antes do loop for, onde você precisa indicar o número de minutos que o loop irá contar regressivamente.

O segundo loop lida com a contagem regressiva da parte segundo do cronômetro. Após cada iteração, o loop pausa por 1 segundo antes de continuar. Ele continuará fazendo isso até que o valor de $seconds chegue a 0.

# Defina o número de minutos para contar regressivamente
$minutes = 1

for ($minutes--; $minutes -gt -1; $minutes--)
{
    for ($seconds = 59 ; $seconds -gt -1 ; $seconds--)
    {
        $remaining = ("{0}:{1}" -f ("{0:d4}" -f $minutes),("{0:d2}" -f $seconds))
        Write-Host "`r$remaining" -NoNewline
        Start-Sleep -Seconds 1
    }
}

Quando o código acima for executado, o cronômetro regressivo será exibido como abaixo.

A Countdown timer using nested for loop

Determinando um número primo

O loop for do PowerShell também é uma boa escolha para operações matemáticas. Neste exemplo, o loop for é usado para determinar se um determinado número é um número primo.

A prime number is a number that is only divisible by 1 and N, where N is the number itself. For example, if the value of N is 7, then N divided by 1 is 7 divided by 1.

O script abaixo, quando executado, realizará o seguinte:

  • Solicitar ao usuário que insira um número.
  • Realizar divisão usando o número de entrada como dividendo, e os divisores são os números de 2 até o número de entrada menos 1. Isso significa que, se o valor de entrada for 7, os divisores serão 2, 3, 4, 5 e 6, respectivamente.
  • Se o quociente for um número inteiro, isso significa que o número de entrada não é um número primo e, em seguida, o loop for será terminado.
  • Se o quociente não for um número inteiro, isso significa que o número de entrada é um número primo.

Copie e salve este script como isPrime.ps1

$num = Read-Host "Input a number"

$isPrime = $true
for ($y = 2 ; $y -lt $num ; $y++ )
{
    if (($num / $y) -is [int]) {
        Write-Host "$num is not a prime number"
        $isPrime = $false
        break
    }
}

if ($isPrime -eq $true) {
    Write-Host "$num is a prime number"
}

Depois de salvar o script isPrime.ps1, execute-o no PowerShell para testar. Para demonstrar, veja a saída de exemplo abaixo.

Using for loop in a script to determine a prime number

Resumo

O loop for do PowerShell não traz surpresas quando comparado com o funcionamento dos loops for usados em outras linguagens – o que torna mais fácil adaptar-se se você não é novo no conceito.

Neste artigo, você aprendeu o básico do comando de loop for do PowerShell. Você aprendeu sobre sua sintaxe, lógica, fluxo e até mesmo aprendeu com vários exemplos sobre como usá-lo para diferentes propósitos.

Lembre-se de que, mesmo que haja outros tipos de loops no PowerShell, não é justo dizer que um é melhor que o outro. Tudo depende do propósito do código e da preferência de quem o escreve.

Usando o conhecimento adquirido neste artigo, você deve ser capaz de encontrar maneiras de aplicar o loop for com mais frequência para automatizar suas tarefas tediosas habituais.

Leitura adicional

Source:
https://adamtheautomator.com/powershell-for-loop/