El bucle While de PowerShell: Una guía básica

PowerShell es un potente lenguaje de script que ofrece muchas funciones para la automatización y gestión de sistemas basados en Windows. Uno de los constructos más comúnmente utilizados es el bucle while de PowerShell.

No te preocupes si te has quedado atrapado en un bucle infinito mientras intentabas aprender a escribir scripts en PowerShell. Deja que el bucle while de PowerShell te guíe hacia tu gran escapada. Y en este tutorial, volverás a los conceptos básicos de trabajar con bucles while en PowerShell mientras escribes tus scripts.

¡Sigue leyendo para llevar tus habilidades de scripting en PowerShell al siguiente nivel!

Requisitos previos

Este tutorial será una demostración práctica. Para seguirlo, asegúrate de tener lo siguiente:

  • A Windows machine – This tutorial uses Windows 10.
  • Windows PowerShell 5.0 o superior instalado: Este tutorial utiliza PowerShell 7.
  • A user account with administrator privileges.

Ejecución de bucles while con una única condición

Uno de los tipos más simples de bucle while es el tipo de condición única. A diferencia de la instrucción If, este tipo de bucle ejecuta un conjunto de comandos dados siempre que una condición especificada se evalúe como verdadera. Cuando se devuelve un ‘Falso’, el bucle se rompe y la ejecución continúa con el resto del script.

A continuación se muestra la sintaxis para un bucle while con una sola condición:

  • Lo primero que notará es el uso de paréntesis. La condición debe estar encerrada entre paréntesis, mientras que el bloque de código es un conjunto de comandos de PowerShell que se ejecutan mientras la condición sea verdadera.
  • Lo segundo a tener en cuenta es que la condición debe devolver un valor booleano, que se evalúa como Verdadero o Falso.
while (condition)
{

	# Bloque de código a ejecutar

}

Ejecute el código a continuación, donde el valor de $val comienza en 0 y se incrementa en 1 cada vez que se ejecuta el bloque de código hasta que el valor de la variable $val sea igual a 3.

Cuando $val alcanza un valor de 3, lo que hace que la condición sea Falsa, el bucle se interrumpe y la ejecución continúa con el resto del script.

# Declara la variable $val con el valor inicial de 0
$val = 0

# Establece el bucle while para que se ejecute hasta que el valor de la variable $val alcance 3
while($val -ne 3)
{
	# Incrementa el valor de la variable $val en 1
	$val++
	
	# Imprime el valor actual de la variable $val
	Write-Host $val
}
Understanding Single Condition While Loops.

Ejecutando un bucle While de PowerShell con variables integradas ($true/$false)

El ejemplo anterior, utilizando condiciones en el bucle while, funciona bien. Pero también puedes utilizar variables integradas de PowerShell, como $true y $false, para crear un bucle While.

La sintaxis a continuación se ejecuta hasta que $true ya no es $true. En otras palabras, el bucle se ejecuta indefinidamente. Pero siempre debes incluir una manera de salir de un bucle infinito. De lo contrario, quedas atrapado para siempre. Aprenderás más sobre cómo salir de un bucle usando break y continue más adelante en este tutorial.

while($true)
{

	# Bloque de código para ejecutar

}

Ejecuta el bloque de código a continuación, que se ejecuta indefinidamente, imprimiendo el valor de $i en la consola.

# Declarar la variable $i con el valor inicial de 0
$i = 0

# Establece el bucle While para que se ejecute mientras la condición sea $true
while($true)
{
	# Incrementa el valor de $i en 1
	$i++
	
	# Imprime el valor actual de la variable $i
	Write-Host $i
}

Ahora, presiona Ctrl+C para salir del bucle. Este bucle consume muchos recursos del sistema, así que ten cuidado al usarlos.

Executing a while loop with PowerShell’s built-in ($true) variable

Ejecutando bucles While de múltiples condiciones

Además de los bucles while con una sola condición, también puedes crear bucles while con múltiples condiciones. Al igual que en el bucle while con una sola condición, las condiciones deben devolver un valor booleano, ya sea Verdadero o Falso.

A continuación se muestra la sintaxis para un bucle while con múltiples condiciones, similar a la sintaxis para un bucle while con una sola condición. La principal diferencia es que puedes incluir múltiples condiciones separadas por los siguientes operadores:

  • Y (-and) – Ambas condiciones deben ser verdaderas.
  • O (-or) – Cualquiera de las condiciones puede ser verdadera.
# Operador Y
while (condition1 -AND condition2)
{

	# Bloque de código a ejecutar

}

# Operador O
while (condition1 -OR condition2)
{

	# Bloque de código a ejecutar

}

Ejecuta el código a continuación, que hace un bucle while mientras $val no sea igual (-ne) a 3 -y $i no sea igual (-ne) a 5.

Cuando los valores de ambas variables alcanzan sus respectivas condiciones, el bucle se rompe y la ejecución continúa con el resto del script.

# Declara las variables $val y $i con valores iniciales de 0
$val = 0
$i = 0

# Establece el bucle While para que se ejecute hasta que $val sea igual a 3 y $i sea igual a 5
while($val -ne 3 -and $i -ne 6)
{
	# Incrementa $val en 1
  $val++
	# Incrementa $i en 2
  $i += 2
	# Imprime el valor actual de las variables $val y $i
  Write-Host "$val, $i"
}

Ejecutando un bucle while con el operador AND

Executing a while loop with AND operator

Ahora, ejecuta el siguiente código, que pide al usuario su edad, almacenada en la variable $age.

Si el usuario ingresa un número menor que (-lt) 1 o no es un número (-nomatch), se le solicita nuevamente que ingrese un número válido. Este comportamiento es útil para dar a los usuarios múltiples oportunidades de ingresar una entrada válida.

# Solicita a los usuarios que ingresen su edad
$age = Read-Host "Please Enter Your Age"

# Establece el bucle While para que se ejecute hasta que el usuario proporcione una entrada válida
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# Solicita nuevamente al usuario que ingrese una edad válida
  $age = Read-Host "Please Enter Your Valid Age"
}
# Imprime la entrada de edad válida
Write-Host "Your age is $age

En la salida a continuación, puedes ver que se le pidió al usuario que ingresara su edad tres veces, de la siguiente manera:

  • La primera vez, el usuario ingresó diez, que no es un número.
  • La segunda vez, el usuario ingresó 0, que está por debajo de 1.
  • La tercera vez, el usuario ingresó 10, que es una edad válida.
Executing a while loop with the OR operator

Uso de las palabras clave BREAK y CONTINUE en bucles While

Has visto cómo los bucles while agregan flexibilidad a tu script de PowerShell. Pero para controlar mejor la ejecución de tus bucles While, agrega las palabras clave break y continue.

Por ejemplo, si solo deseas procesar un cierto número de elementos en una matriz, puedes usar la palabra clave BREAK para salir del bucle cuando se hayan procesado el número deseado de elementos.

Estas palabras clave funcionan de la siguiente manera:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

Ejecuta el código a continuación, que recorre una matriz de 10 elementos.

En el código a continuación, la declaración if verifica el valor de $i. Si el valor de $i es 5, la palabra clave continue salta sobre el código restante en el bucle y continúa con la siguiente iteración. Si el valor de $i es 8, la palabra clave break sale del bucle y continúa con el resto del script.

De lo contrario, el bucle while imprime (Write-Host) e incrementa el valor de la variable $i en 1.

# Declara un $array de 10 elementos
$array = 1..10
# Declara la variable $i con el valor inicial de 0
$i = 0
# Configura el bucle While para que se ejecute hasta que se cumpla la condición
while($i -lt $array.Count)
{
	# Verifica si $i es igual a 5
  if($i -eq 5)
  {
		# Si es así, incrementa $i en 1
    $i++
		# Continúa con la siguiente iteración
    continue
  }
	# Verifica si $i es igual a 8
  if($i -eq 8)
  {
		# Si es así, rompe el bucle While y continúa con el resto del script
    break
  }
	# Imprime el valor actual de $i
  Write-Host "Processing item $i"
	# Incrementa $1 en 1
  $i++
}

Como puedes ver en la salida a continuación, el bucle omitió el quinto y octavo elementos en el array. El bucle while procesó todos los demás elementos en el array y salió después de alcanzar el octavo elemento.

Executing a while loop with break and continue keywords

Limitar el Tiempo que Ejecuta un Bucle While

Normalmente, es posible que desees limitar el tiempo que ejecuta un bucle. Tal vez estás intentando conectarte a un servidor remoto. Si es así, puedes darle al servidor tiempo para responder antes de agotar el tiempo y salir del bucle utilizando el cmdlet Start-Sleep dentro de tu bucle while.

El cmdlet Start-Sleep pausa la ejecución del script durante un tiempo especificado.

Ejecute el código a continuación para obtener y almacenar la fecha y hora actuales Get-Date en la variable $startTime. El bucle while se ejecuta mientras la fecha/hora actuales es menor que 10 segundos desde el valor almacenado en $startTime.

A medida que se ejecuta el bucle while, se imprime un mensaje mientras el cmdlet Start-Sleep pausa la ejecución del script durante 1 segundo.

El bloque de código a continuación es solo un esquema para lo que realmente usaría en la práctica. Puede poner más en el código dentro del bucle según sea necesario.

# Obtener y almacenar la fecha/hora actual
$startTime = Get-Date
# Establece el bucle While para que se ejecute mientras la fecha/hora actual sea menor que 10 segundos 
	# desde el valor almacenado en $startTime.
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# Imprime un mensaje
  Write-Host "Waiting for server to respond..."
	# Pausa el script durante un segundo
  Start-Sleep -Seconds 1
}

A continuación, puedes ver que el bucle continuó ejecutándose durante 10 segundos antes de salir del bucle.

Limiting the time a while loop runs

Conclusión

Los bucles while de PowerShell son útiles cuando te enfrentas a conceptos complejos para evitar quedarte atascado en un bucle o mientras escribes tus scripts. Y en este tutorial, has aprendido muchas formas de trabajar con los bucles while para crear scripts más flexibles y potentes.

Con este nuevo conocimiento, el cielo es el límite. ¿Por qué no aprovechar al máximo el uso de operadores lógicos y palabras clave para automatizar tareas con tus scripts?

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