Cómo usar PowerShell For Loop, While Loop y otros bucles

En este artículo, revisaremos los bucles For, bucles While, bucles Do-While y bucles Do-Until en PowerShell. Explicaré cómo se construyen los bucles en PowerShell y cómo definir condiciones para entrar o salir de un bucle.

Bucle For de PowerShell

El bucle For es un bucle de conteo y se utiliza principalmente cuando necesitas repetir una tarea un cierto número de veces, procesar una colección o especificar elementos por un número de índice. Se repite mientras la condición de prueba se evalúa como verdadera y sale cuando es falsa.

PowerShell For Loop

La sintaxis para un bucle For es la siguiente:

for (<Init>; <Condition>; <Repeat>) {

<Script Block>

}
  • El bloque <Inicialización> ejecuta un comando o un conjunto de comandos antes de que comience el bucle. Por lo general, este es el lugar donde se inicializa la variable de conteo.
  • En la sección <Condición>, se evalúa la prueba condicional. Si es verdadera, se entra en el bucle y se ejecutan los comandos en el bloque de script. Luego, la condición se evalúa nuevamente hasta que dé como resultado falsa.
  • El marcador <Repetición> ejecuta uno o más comandos, separados por comas en cada iteración del bucle. Por lo general, se usa para modificar la variable de conteo.

Si deseas repetir una operación específica cinco veces, usa el siguiente ejemplo:

Protección de datos

Conozca qué datos sensibles se almacenan, evalúe el riesgo asociado con ellos e implemente medidas de protección de datos basadas en políticas con DataSecurity Plus, el software de protección de datos de ManageEngine. Comience hoy mismo con una prueba gratuita totalmente funcional de 30 días.

Learn More

for ($var = 1; $var -le 5; $var++) {

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
A PowerShell loop repeating the same operation five times

Aquí, la variable se inicializa con un valor de 1, que es menor que 5, por lo que se ingresa al bucle y se ejecuta el bloque de script. En cada iteración, el valor de la variable se incrementa en 1 y se evalúa contra la condición hasta que el resultado sea falso.

Dado que la condición se evalúa al principio, si el resultado es falso, el bloque de comandos no se ejecutará:

for ($var = 6; $var -le 5; $var++) {

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
If the initial condition if false, the loop won’t be executed

Si es necesario, puede utilizar operadores lógicos para especificar más condiciones. En este caso, agregamos múltiples condiciones. Y debido a que el operador lógico -and resulta en verdadero solo cuando ambas condiciones son verdaderas, el bucle se detiene cuando la expresión $var -ne 3 alcanza un estado falso.

for ($var = 1; $var -le 5 -and $var -ne 3; $var++) {

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
We added another condition to stop the script when the variable reaches a false state.

Como se mencionó anteriormente, puede ejecutar uno o más comandos en los marcadores <Init> y <Repeat>. En el ejemplo a continuación, tenemos una variable $var1 con un valor inicial de 1, que se incrementa, y su valor se evalúa para comprobar si es menor o igual a 5.

Sin embargo, también tenemos una segunda variable, $var2. Tiene un valor inicial de 5, que se decrementa pero no se evalúa como parte de la condición.

for (($var1 = 1), ($var2 = 5); $var1 -le 5; ($var1++), ($var2--)) {

Write-Host The value of Var1 is: $var1

Write-Host The value of Var2 is: $var2

}

Write-Host End of for loop.
Two different variables are being updated 

Cómo definir condiciones de bucle en PowerShell

En PowerShell, los comandos se ejecutan de forma secuencial. Pero a veces, es posible que necesites repetir un comando o un conjunto de comandos hasta que se cumpla cierta condición. Esto se denomina un bucle.

Para definir las condiciones para entrar o salir de un bucle en PowerShell, es necesario usar operadores de comparación. Te permitirán comparar valores o encontrar un valor que coincida con un patrón específico. El resultado es un valor booleano (true o false), que es evaluado por la lógica del bucle.

Puedes usar operadores de comparación para comparar valores numéricos:

Operation Result
2 -eq 2 True
2 -eq 5 False
3 -gt 7 True
5 -lt 3 False

También puedes comparar valores de cadena con operadores de comparación:

Protección de datos

Identifica qué datos sensibles se almacenan dónde, evalúa el riesgo asociado con ellos, e implementa medidas de protección de datos basadas en políticas con DataSecurity Plus, el software de protección de datos de ManageEngine. ¡Comienza hoy mismo con una versión de prueba gratuita y totalmente funcional de 30 días!

Learn More

Operation Result
‘PowerShell’ -eq ‘powershell’ True
‘PowerShell’ -eq ‘cmd’ False
‘PowerShell’ -like ‘power*’ True
‘PowerShell’ -notlike ‘*shell’ False

Bucle Foreach de PowerShell

El bucle foreach se utiliza para iterar a través de elementos en una colección. En este escenario, no tienes una condición que evaluar, pero el bucle se repite hasta que todos los elementos en la colección hayan sido procesados.

<Figure Foreach_Diagram.png>

The syntax for a Foreach loop is the following:

foreach ($<item> in $<collection) {

<Script Block>

}

Aquí, comenzamos con la declaración foreach, seguida de corchetes con una variable y una colección para iterar. Luego viene el bloque de script a ejecutar. La variable se crea automáticamente y se le asigna un valor del array antes de cada ejecución del bucle.

Nuevamente, para ejecutar el bucle cinco veces, necesitarás una colección con cinco elementos. En este caso, estos serán los valores enteros del 1 al 5:

$collection = 1..5

foreach ($item in $collection) {

Write-Host The value of Item is: $item

}

Write-Host End of foreach loop
We ran a PowerShell ForEach loop with a collection of five items.

La variable se inicializa con el primer valor de la colección, que es 1, luego se ejecuta el bloque de script. En la siguiente iteración, la variable se asigna con el siguiente elemento en el array, que es 2. El bloque de script se procesará una y otra vez hasta que todos los elementos en la colección sean procesados.

Por ejemplo, si quisieras procesar los primeros cinco servicios que trabajan en tu computadora, tu bucle se vería así:

foreach ($service in (Get-Service | Select-Object -First 5)) {

Write-Host Service name is: $service.name and status is $service.status

}
This script shows the first five services working on our computer

Debes entender que hay una diferencia entre el bucle Foreach y el comando Foreach-Object. Es fácil confundirlos. Un bucle Foreach siempre comienza con una declaración Foreach, mientras que el comando Foreach-Object seguirá a un comando con un pipeline a medida que procesa los objetos enviados a través de él.

Bucle While de PowerShell

La declaración While en PowerShell se utiliza para crear un bucle que ejecuta un comando o un conjunto de comandos si la condición se evalúa como verdadera. Verifica la condición antes de ejecutar el bloque de script. Mientras la condición sea verdadera, PowerShell ejecutará el bloque de script hasta que la condición resulte en falsa.

Diagram showing how a PowerShell While loop works

La sintaxis para un bucle while es la siguiente:

while (<Condition>){<Script Block>}

Por ejemplo, si tienes una variable llamada var con un valor inicial de 1 y deseas repetir el bucle cinco veces, el bucle debería seguir esta estructura:

Protección de datos

Conoce qué datos sensibles se almacenan dónde, evalúa el riesgo asociado con ellos e implementa medidas de protección de datos basadas en políticas con DataSecurity Plus, el software de protección de datos de ManageEngine. Empieza hoy con una prueba gratuita totalmente funcional de 30 días.

Learn More

$var = 1

while ($var -le 5)

{

Write-Host The value of Var is: $var

$var++

}

Write-Host End of While loop.
Example of a loop running five times

En el ejemplo anterior, la variable se inicializa fuera del bucle y se incrementa en el bloque de script. El cmdlet Write-Host se utiliza para mostrar el valor de la variable en cada ciclo del bucle.

Es importante tener en cuenta que si la condición es inicialmente falsa, entonces el bucle no se activará. En nuestro ejemplo, si tuviéramos un valor para la variable (var = 6), entonces el comando del bucle no funcionaría en absoluto y el bloque de script no se ejecutaría.

$var = 6

while ($var -le 5)

{

Write-Host The value of Var is: $var

$var++

}

Write-Host End of While loop.
The result of the loop if the initial condition is false

Puedes usar condiciones más complejas utilizando operadores lógicos. Por ejemplo, si deseas que la variable sea menor que 5 y no igual a 3, el bucle se vería así:

$var = 1

while ($var -le 5 -and $var -ne 3)

{

Write-Host The value of Var is: $var

$var++

}

Write-Host End of While loop.
Running the loop with a variable we want to be less than 5 and not equal to 3

Como se mencionó anteriormente, al utilizar el operador lógico -and, el resultado es verdadero solo cuando ambas pruebas condicionales se evalúan como verdaderas. En este caso, cuando la variable recibe el valor de 3, la segunda condición se convierte en falsa: esto da como resultado un falso, deteniendo el bucle.

Bucle Do-While de PowerShell

A Do-While loop is a variant of the While loop, and the main difference is that the script block is executed before the condition is checked. This means that even if the start condition is false, the script block will be executed at least once.

Diagram showing how a PowerShell Do-While loop works

La sintaxis de un bucle Do-While es la siguiente:

do {

<script block>

} while (<condition>)

Por lo tanto, si usamos el mismo ejemplo que antes, el código se vería así:

$var = 1

do {

Write-Host The value of Var is: $var

$var++

} while ($var -le 5)

Write-Host End of Do-While loop.
Running a Do-While loop

Ejecutemos un bucle Do-While con un valor para la variable var = 6. Aquí, el bucle se ejecutará una vez antes de verificar que la condición era falsa.

$var = 6

do {

Write-Host The value of Var is: $var

$var++

} while ($var -le 5)

Write-Host End of Do-While loop.
The script was still executed even though the initial condition was false.

Nuevamente, también es posible utilizar operadores lógicos. Si usamos el mismo ejemplo que antes, verás que el bucle se detiene cuando el valor de la variable es 3 porque queríamos que nuestra variable fuera menor que 5 y no igual a 3:

Protección de datos

Conozca qué datos sensibles se almacenan dónde, evalúe el riesgo asociado con ellos e implemente medidas de protección de datos basadas en políticas con DataSecurity Plus, el software de protección de datos de ManageEngine. Comience hoy mismo con una prueba gratuita totalmente funcional de 30 días.

Learn More

$var = 1

do {

Write-Host The value of Var is: $var

$var++

} while ($var -le 5 -and $var -ne 3)

Write-Host End of Do-While loop.
The script stops because we wanted our variable to be less than 5 and not equal to 3

Bucle Do-Until de PowerShell

El bucle Do-Until funciona de la misma manera que el bucle Do-While: ejecuta primero el bloque de script y luego evalúa la condición. La diferencia aquí es que mientras el bucle Do-While entra en el bucle con una condición verdadera, el bucle Do-Until busca una condición falsa para entrar en el bucle.

Diagram showing how a PowerShell Do-Until loop works

La sintaxis para un bucle Do-Until es la siguiente:

do {

<script block>

} until (<condition>)

Como puede ver, la estructura se ve casi idéntica a un bucle Do-While. Sin embargo, veamos cuál sería el resultado si seguimos utilizando nuestro ejemplo anterior:

$var = 1

do {

Write-Host The value of Var is: $var

$var++

} until ($var -le 5)

Write-Host End of Do-Until loop.
The Do-Until loop is not triggered as it needs an initial false result

Dado que la prueba condicional se evalúa como verdadera, el bucle Do-Until no se activa porque necesitamos un resultado falso para entrar en el bucle. En este caso, si desea repetir el bucle 5 veces, el operador lógico debe cambiarse a mayor que (-gt), lo que proporcionará un resultado falso para las primeras 5 iteraciones:

$var = 1

do {

Write-Host The value of Var is: $var

$var++

} until ($var -gt 5)

Write-Host End of Do-Until loop.
Changing the logical operator to ‘greater than’ provides us a false result for the first iterations of the loop

Nuevamente, dado que necesitamos que la condición inicial sea falsa para entrar y permanecer en el bucle, esto afectaría también a los operadores lógicos si necesitáramos definir una expresión más compleja.

En el siguiente ejemplo, debemos usar el operador o para hacer que el bucle se repita hasta que nuestra variable sea mayor que 5 (el resultado falso requerido) o igual a 3. No podríamos usar el operador y, lo que habría requerido que la variable fuera mayor que 5 y igual a 3 al mismo tiempo porque habría resultado en un bucle infinito.

$var = 1

do {

Write-Host The value of Var is: $var

$var++

} until ($var -gt 5 -or $var -eq 3)

Write-Host End of Do-Until loop.
We use the -or operator to have the Do-Until loop repeat until our variable is greater than 5 or equal to 3

Cómo controlar los bucles en PowerShell

Puedes controlar el flujo de la ejecución en un bucle usando palabras clave para salir del bucle sin evaluar la condición o saltar la iteración actual del bucle. Aunque esas palabras clave pueden ser útiles a veces, no siempre se recomiendan ya que pueden hacer que el script sea más difícil de leer.

La declaración break

La declaración break detiene y sale del bucle actual inmediatamente sin ejecutar el resto del código en el bloque de script del bucle y sin evaluar la condición especificada. Esto permite a PowerShell continuar ejecutando el resto del código.

La palabra clave break se comporta de la misma manera independientemente del tipo de bucle utilizado. Usando uno de los ejemplos anteriores, contaremos del 1 al 5 y saldremos del bucle si la variable de conteo es igual a tres. Pero esta vez, agregaremos un break en lugar de usar operadores lógicos en la condición de prueba.

Protección de Datos

Conozca qué datos sensibles se almacenan dónde, evalúe el riesgo asociado con ellos e implemente medidas de protección de datos basadas en políticas con DataSecurity Plus, el software de protección de datos de ManageEngine. Comience hoy mismo con una prueba gratuita totalmente funcional de 30 días.

Learn More

Para lograr esto, se utilizará la declaración if para definir los criterios de salida.

For ($var = 1; $var -le 5; $var++) {

if ($var -eq 3) {break}

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
We’ve used a break statement instead of using logical operators to stop the script

Cuando el valor de la variable de conteo es igual a 3, se activa la declaración if y se ejecuta la palabra clave break. Dado que la palabra clave break se coloca antes del comando Write-Host en el bloque de script, este último no se procesará. El bucle se detiene y el script continúa ejecutando el código restante.

La declaración continue

La declaración continue le permite omitir la parte restante del código, devolviéndolo al inicio del bucle sin salir de él.

Como en el ejemplo anterior, se utilizará un bucle For, pero esta vez en lugar de salir del bucle cuando la variable de conteo llegue a 3, PowerShell omitirá el resto del código para la iteración actual y procederá con el bucle hasta que la prueba condicional sea falsa.

for ($var = 1; $var -le 5; $var++) {

if ($var -eq 3) {Continue}

Write-Host The value of Var is: $var

}

Write-Host End of for loop.
The if statement is triggered when the value of the variable is equal to 3

Como habrás notado, cuando el valor de la variable es igual a 3, se activa la declaración if, ejecutando la declaración continue. Luego omite el resto del código dentro del bucle sin romperlo.

Conclusión

PowerShell admite varios tipos de bucles, y es realmente importante entender cómo te pueden ayudar a simplificar tus scripts y repetir ciertas acciones de manera consistente. Hemos cubierto consejos y trucos de PowerShell de manera exhaustiva en Petri, así que asegúrate de consultar nuestras otras guías sobre cómo escribir scripts de PowerShell y cómo usar la opción ForEach Parallel.

Artículo relacionado:

Source:
https://petri.com/how-to-use-powershell-for-while-loops/