Bucle For de PowerShell: Una Guía Integral

Cuando usas scripts de PowerShell para gestionar sistemas o procesar tareas masivas, sin duda te encontrarás con la necesidad de utilizar una construcción de bucle como parte de tus scripts. Hay muchos tipos de bucles disponibles en PowerShell, y uno de ellos es el bucle for. El bucle for de PowerShell puede ejecutar rápidamente el mismo conjunto de comandos en varios elementos y producir resultados consistentes.

En este artículo, aprenderás qué es el bucle for en PowerShell, comprenderás su sintaxis y qué forma parte de una declaración de bucle for. También aprenderás de los ejemplos algunas de las diferentes formas en que puedes utilizar el bucle for.

Comprendiendo la Declaración y Marcadores de Posición del Bucle for en PowerShell

El bucle for de PowerShell se utiliza comúnmente cuando ya se conoce el número de veces (conteo de iteraciones) que un comando o proceso necesita ejecutarse. Un ejemplo sería cuando deseas procesar solo un subconjunto de valores en un array (por ejemplo, procesar solo 10 de un total de X elementos).

Usar un bucle for proporciona un mayor control sobre los límites y las condiciones de cuándo el código debe salir. Esto se compara con el bucle foreach o el cmdlet ForEach-Object, donde la iteración se detiene después de procesar el último elemento de la colección.

A continuación se muestra la sintaxis de la declaración del bucle for para tu referencia.

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

Como puedes ver en la sintaxis anterior, la declaración del bucle for de PowerShell se puede dividir en cuatro marcadores de posición que debes conocer. Estos son los marcadores de posición Inicial, Condición, Repetición, y Lista de declaraciones.

  • El marcador Inicial es donde especificas un valor inicial. Este valor solo es leído por la declaración una vez. Normalmente, los guionistas asignan esta variable con un valor de cero.
  • El marcador Condición especifica el límite o la condición para determinar si el bucle debe continuar ejecutándose o finalizar. La expresión utilizada en este marcador se evalúa como verdadera.
  • El marcador Repetir acepta múltiples comandos. Los comandos proporcionados en este marcador se ejecutan después de que cada bucle se repite y antes de que se reevalúe el Condición. Los guionistas suelen usar esto para proporcionar una expresión para incrementar o decrementar el valor en el marcador Inicial.
  • Por último, el marcador Lista de declaraciones es donde se colocará el código principal que se pretende ejecutar. El código dentro de este marcador se repite en un bucle hasta que el Condición devuelve un valor de $False.

Comprender el Flujo de Ejecución del Bucle For de PowerShell

Para entender mejor cómo funciona el bucle for de PowerShell, necesitas familiarizarte con su flujo de ejecución. Un bucle for es inicialmente un proceso de cuatro pasos, luego se convierte en un proceso de tres pasos después de la ejecución inicial. Para explicarlo mejor, sigue leyendo el algoritmo a continuación.

PASO 1

Al principio de la declaración del bucle for, se lee el valor Inicial y se almacena en la memoria.

Ejemplo: $num = 0

PASO 2

El enunciado del bucle for evalúa el resultado booleano de la expresión dentro del marcador Condición. Si el resultado es $false, el bucle for se termina. Si el resultado es $true, entonces el bucle for continúa con el siguiente paso.

Ejemplo: $num -lt 10

PASO 3

PowerShell ejecuta el código dentro del marcador Lista de declaraciones. Puede haber uno o más comandos, bloques de script o funciones.

Ejemplo: "Cuento $num "

PASO 4

En este paso, se ejecuta la expresión en el marcador Repetir, que actualizará el valor actual del marcador Inicial. Luego, el flujo volverá al Paso 2.

Ejemplo: $num++

Usando el Bucle For de PowerShell (Ejemplos)

Las siguientes secciones serán algunos ejemplos de cómo usar el bucle for de varias maneras. Estos ejemplos pueden tener o no uso práctico o en la vida real tal como están. Pero las técnicas que aprenderás pueden guiarte en el uso del bucle for si te encuentras con una necesidad real de hacerlo.

Ahora que tienes la idea de cómo funciona el bucle for, es hora de que veas cómo todo se une usando código básico.

Obtener una Secuencia de Números

El código a continuación muestra la cadena "Cuento $num" repetidamente en la consola comenzando desde 1 hasta que el valor de $num alcance 10.

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

Cuando copias el código anterior y lo pegas en tu sesión de PowerShell para ejecutarlo, esta captura de pantalla a continuación te muestra el resultado.

For loop example to display numbers less than 10

Concatenando Cadenas

La declaración del bucle for no se limita solo a expresiones matemáticas como la suma, resta o multiplicación. También se puede utilizar para concatenar valores de cadena.

El ejemplo a continuación repetirá la letra “x” en cada línea, con un carácter más que la línea anterior hasta que el número de caracteres en la línea alcance 30.

Como se puede ver, el valor de $x se inició con '', que contiene cero caracteres. El límite, según la condición, es hasta que el número de caracteres en el valor de $x alcance 30. Después de cada iteración, se agrega una letra “x” más al valor de $x.

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

La salida a continuación muestra el resultado esperado cuando se ejecuta el código anterior en PowerShell.

String concatenation example using For Loop

Concatenando Cadenas con Múltiples Expresiones Iniciales y de Repetición

Los marcadores de posición Inicial y Repetición en la declaración del bucle for pueden aceptar múltiples expresiones.

Usando el código del ejemplo anterior, el código se puede modificar para agregar una nueva expresión en el marcador de posición Repetición para elegir un color aleatorio. El color aleatorio se utilizará como color de primer plano de la cadena que se mostrará en la consola.

Como se puede ver en la primera línea, se define un array que contiene nombres de colores. La operación del bucle for elegirá aleatoriamente un nombre de color de este array.

Observe que los marcadores de posición Inicial y Repetición ahora tienen dos expresiones. Cada expresión está encerrada entre paréntesis y separada por una coma.

$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
}

Una vez que se ejecuta el código modificado en PowerShell, se muestra el resultado esperado a continuación.

String concatenation example using For Loop

Mostrando Progreso

Quizás el uso más común del bucle for sea para mostrar indicadores de progreso. Esto se emplea principalmente al ejecutar tareas para elementos a granel que pueden tardar tiempo en completarse. Por ejemplo, crear un informe de todos los tamaños de buzones en tu organización de Exchange, o actualizar atributos de varios usuarios en Active Directory.

El código de ejemplo a continuación te muestra la forma básica de mostrar el progreso del 1 al 100%. Como verás, el valor inicial del $counter es 1, y la condición indica que este bucle se ejecutará hasta que el valor de $counter alcance 100.

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

Cuando ejecutes el código anterior en PowerShell, deberías ver una salida similar, como se muestra a continuación.

Progress counter driven by for loop

Mostrando un Temporizador de Cuenta Regresiva

El siguiente código muestra cómo usar el bucle for para mostrar un temporizador de cuenta regresiva. Este temporizador de cuenta regresiva solo muestra los segundos restantes, comenzando desde 10.

Si deseas cambiar el número inicial, solo necesitas cambiar el valor de la variable $seconds en el marcador Inicial.

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

Al ejecutar el código anterior en PowerShell, obtendrás la siguiente salida de ejemplo.

A countdown timer that is driven by for loop

Mostrando un Temporizador de Cuenta Regresiva (Bucle For Anidado)

¿Qué pasa si quieres mostrar el temporizador de cuenta regresiva usando el formato minutos:segundos? El bucle anidado puede usarse para lograr eso. Un bucle for anidado se define simplemente como un bucle for dentro de otro bucle for y así sucesivamente.

El código de muestra a continuación contiene dos declaraciones de bucle for.

El primer bucle for maneja la cuenta regresiva de la parte de los minutos del temporizador. Como puedes ver, hay una variable $minutos antes del bucle for donde necesitas indicar el número de minutos desde los que el bucle for realizará la cuenta regresiva.

El segundo bucle for maneja la cuenta regresiva de la parte de los segundos del temporizador. Después de cada iteración, el bucle se pausa durante 1 segundo antes de continuar. Continuará haciéndolo hasta que el valor de $segundos llegue a 0.

# Establecer el número de minutos desde el cual hacer la cuenta regresiva
$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
    }
}

Cuando se ejecuta el código anterior, así es como se vería el temporizador de cuenta regresiva.

A Countdown timer using nested for loop

Determinación de un número primo

El bucle for de PowerShell también es una buena opción para operaciones matemáticas. En este ejemplo, el bucle for se usa para determinar si un número dado es un 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.

El script a continuación, cuando se ejecuta, realizará lo siguiente:

  • Pedir al usuario que introduzca un número.
  • Realizar divisiones usando el número introducido como dividendo, y los divisores son los números del 2 al número introducido menos 1. Esto significa que si el valor introducido es 7, los divisores son 2, 3, 4, 5 y 6, respectivamente.
  • Si el cociente es un número entero, esto significa que el número de entrada no es un número primo y luego, el bucle for se terminará.
  • Si el cociente no es un número entero, esto significa que el número de entrada es un número primo.

Copia y guarda 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"
}

Una vez que hayas guardado el script isPrime.ps1, ejecútalo en PowerShell para probarlo. Para demostrarlo, vea la salida de ejemplo a continuación.

Using for loop in a script to determine a prime number

Resumen

El bucle for de PowerShell no trae sorpresas en comparación con cómo funcionan los bucles for utilizados en otros lenguajes, y eso facilita su adaptación si no eres nuevo en el concepto.

En este artículo, has aprendido los conceptos básicos de la declaración de bucle for de PowerShell. Has aprendido sobre su sintaxis, lógica, flujo, e incluso has aprendido de varios ejemplos sobre cómo usarlo para diferentes propósitos.

Recuerda que aunque haya otros tipos de bucles en PowerShell, no es justo decir que uno es mejor que otro. Todo depende del propósito del código y la preferencia de quien escribe el código.

Usando los conocimientos que adquiriste de este artículo, deberías ser capaz de encontrar formas de aplicar el bucle for más para automatizar tus tareas tediosas habituales.

Lectura adicional

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