Pide tu presupuesto ya!
20th December 2024
Una de las características clave de PowerShell es su capacidad para recorrer colecciones de datos, lo que le permite ejecutar un bloque de código repetidamente.
En este tutorial, exploraremos tres estructuras de bucle fundamentales en PowerShell: foreach, fory do bucles.
Al final de este tutorial, tendrá una comprensión sólida de cómo utilizar estos bucles para manejar tareas repetitivas y procesar recopilaciones de datos de manera más efectiva.
foreach Bucles: iterando con facilidadCuando necesite ejecutar un bloque de código para cada elemento, el foreach loop hace que las tareas repetitivas sean simples y eficientes. Este bucle es una estructura más compleja pero muy común que funciona de maravilla ya sea que esté trabajando con una variedad de nombres de servidores o procesando cualquier otra colección.
Cada foreach realiza una tarea común; te permite ejecutar algún código para cada uno elemento de una colección. Realiza una ‘iteración’ para ‘iterar sobre’ cada elemento de esa colección, lo que le permite abordar cada elemento individualmente.
Este primer ejemplo tiene una serie de cadenas que representan nombres de servidores. El objetivo es simplemente leer cada cadena de esa matriz.
$servers = @('localhost','SRV2','SRV3','SRV4')
Crear un foreach bucle con una variable llamada $server que representa cada elemento de esa matriz mientras se procesa.
foreach ($server in $servers) {
Write-Host "I'm processing server $server right now..."
}
Puedes ver que PowerShell ejecutó el Write-Host comando y lea cada elemento de la matriz. PowerShell sabía cuántas veces ejecutar debido a la cantidad de elementos que había en la matriz.
Si alguna vez tienes una matriz grande, siempre puedes usar el Count() método para ver cuántas veces se ejecutará el bucle.
$servers.Count

También puedes utilizar el ForEach-Object cmdlet, que es útil cuando desea utilizar la canalización iterando sobre cada elemento de una matriz. Normalmente, verás el ForEach-Object cmdlet utilizado con la canalización.
ForEach-Object -InputObject $servers -Process {
Write-Host "I'm processing server $server right now..."
}

desde el ForEach-Object cmdlet’s InputObject El parámetro admite la entrada de canalización, puede canalizar la colección directamente a él. Excluir el Process nombre del parámetro e incluya el bloque de script inmediatamente después del ForEach-Object llamar.
Este método funciona muy bien cuando se procesan colecciones pequeñas, pero puede ser más lento cuando se trabaja con colecciones extensas.
$servers | ForEach-Object {
Write-Host "I'm processing server $_ right now..."
}

Y finalmente, tenemos el foreach() método. Al igual que con las opciones anteriores, puede utilizar este método en matrices, no en una declaración o comando. es el mas rapido foreach bucle, ejecutado mediante notación de puntos típica que ejecuta un método en un objeto con un bloque de script en su interior.
$servers.foreach({Write-Host "I'm processing server $_ right now..."})
Cada foreach El bucle es generalmente el mismo cuando se procesan colecciones pequeñas. Normalmente puedes ir con un foreach declaración. ¿Por qué? Porque puede definir una variable descriptiva en lugar de utilizar la variable de canalización (el guión bajo del dólar), que no es tan intuitivo.

for Bucles: flexibilidad y controlA continuación, tenemos for bucles. For Los bucles son bucles que no son tan inteligentes como foreach bucles. For Los bucles no tienen idea de cuántos elementos hay en una colección. For Los bucles comienzan en un número, incrementan ese número cada vez y se detienen cuando una condición es verdadera.
El for El bucle tiene cuatro elementos diferentes:
| Elemento | Función |
|---|---|
Variable iteradora (p. ej., $i) |
Normalmente se define como $iEl punto de partida, que está en 0 aquí. |
Condición ($true o $false) |
La condición que se debe cumplir para que el ciclo continúe. En este caso, $true. |
Acción (por ejemplo, $i++) |
La acción a realizar para cada iteración. Normalmente verás que esto es $i++ que incrementa la variable en 1 para cada iteración. |
bloque de secuencias de comandos {} |
El bloque de script, encerrado en {} Contiene el código que se ejecutará en cada iteración. |
En este ejemplo, este for bucle:
0.Write-Host referencia.10que es.1 ($i++), estableciendo el valor en 1 ya que la variable iteradora es menor que 10.## The for Loop (Allows you to reference element indexes dynamically)
for ($i = 0; $i -lt 10; $i++) {
Write-Host "I'm on iteration number $i now."
}
Para aplicar for bucles a matrices, puede utilizar el hecho de que las matrices tienen un índice que comienza en 0 e incrementando en 1 imitar un foreach bucle.
## Change the value of array items
for ($i = 0; $i -lt $servers.Length; $i++) {
$servers[$i] = "new $($servers[$i])"
}
$servers
Otro uso útil de for bucles es la capacidad de hacer referencia a elementos pasados y futuros mientras se procesa un elemento actual.
Por ejemplo, es posible que necesite hacer referencia al nombre del servidor que acaba de procesar. No puedes hacerlo en un foreach bucle.
Pero en un for bucle, suma o resta de la variable iteradora y la utiliza como índice de matriz para hacer referencia al nombre del servidor que necesita.
## Reference elements before or after based on the current item
for ($i = 1; $i -lt $servers.Length; $i++) {
Write-Host $servers[$i] "comes after" $servers[$i-1]
}
terminemos for bucles con un ejemplo real basado en el escenario con el que hemos estado trabajando, pero modificado ligeramente.
Es posible que necesite leer el contenido de algunos archivos de configuración de aplicaciones de varios servidores. El problema es que el nombre del archivo no es el mismo en cada servidor sino que sigue un patrón. Hay un número en el nombre del archivo, como puede ver a continuación (por ejemplo, App_configuration1.txt).
No podemos simplemente usar un foreach bucle aquí porque el nombre del archivo difiere cada vez. Pero como el archivo tiene un número creciente, un for el bucle funcionará.
Crear un for bucle que:
$servers la matriz tiene. Debe definir la variable iteradora como menor que el recuento de todos los elementos en el $servers formación.$servers índice de matriz dentro del bloque de script que comienza en 0 e incrementa el valor en 1 para crear el número en el archivo de configuración.## But what if the problem is a little more complex? A number in the file name
$servers = @('localhost','SRV2','SRV3','SRV4')
Get-Content -Path "\\$($servers[0])\c$\App_configuration1.txt"
Get-Content -Path "\\$($servers[1])\c$\App_configuration2.txt"
Get-Content -Path "\\$($servers[2])\c$\App_configuration3.txt"
Get-Content -Path "\\$($servers[3])\c$\App_configuration4.txt"
for ($i = 0; $i -lt $servers.Count; $i++) {
Write-Host "Processing servers array index number $i which is server $($servers[$i])..."
Write-Host "The next servers array index after this one is $($i + 1)."
Write-Host "Looking for file name App_configuration$($i+1).txt..."
Get-Content -Path "\\$($servers[$i])\c$\App_configuration$($i+1).txt"
}
Puedes ver que el for bucle procesado cada Get-Content comando para leer el archivo apropiado en el servidor apropiado.
do Bucles: garantizar acciones antes que condicionesTerminemos los bucles con algunos útiles que pueden no ser tan comunes como foreach y forpero cuando los necesitas, vienen en tu mano.
Primero está el while bucle. El while El bucle es útil cuando se ejecuta un código mientras algo más se encuentra en un estado particular o cumple una condición específica (por ejemplo, un contador).
Este while El bucle sólo se ejecuta mientras el $counter variable es menor que 10.
## The while Loop (Do something while a specific state for something else)
$counter = 0
while ($counter -lt 10) {
$counter
$counter++
}
Para evitar un bucle infinito que nunca se detiene, agregue un código de bloque de script que incremente el contador en 1 para cada iteración. El bucle regresa 0 a través de 9que es el valor de $counter en el momento de cada iteración.
Ahora, cubramos un ejemplo real.
Para esto while bucle, hace ping a una máquina constantemente solo mientras devuelve un $true valor. Entonces no haces DOS en la máquina; hace una pausa de un segundo entre intentos.
Puede crear algunas funciones de espera avanzadas con while bucles como este.
## Ping SOMESERVER every second only while Test-Connection returns true
while (Test-Connection -ComputerName 'SOMESERVER' -Quiet -Count 1) {
Start-Sleep -Seconds 1
}
Write-Host 'SOMESERVER is now offline.'
El siguiente es el do/while bucle. Este bucle es similar al while bucle, pero a diferencia del while bucle, siempre realiza una acción (la do parte) y entra en esa while bucle.
A continuación se muestra una forma absurda de utilizar un do/while bucle.
## The do/while loop (Do something THEN CONTINUE doing something until a condition is met)
do {
$choice = Read-Host -Prompt 'What is the best programming language?'
} while ($choice -ne 'PowerShell')
Observe que no saldrá del ciclo antes de que dé la respuesta “correcta”. El bucle continúa ejecutando el Read-Host ordenar continuamente cuando la respuesta no es la que quiere que sea.
Y finalmente, tenemos el do/until bucle.
Similar al do/while bucle, el do/until El bucle hace algo y luego se detiene cuando se cumple una condición. Este bucle define la condición de parada y no la condición de continuación.
## The do/until loop (Do something THEN STOP when a condition is met)
do {
$choice = Read-Host -Prompt 'What is the best programming language?'
} until ($choice -eq 'PowerShell')
Write-Host -Object 'Correct!'
Puede replicar el mismo escenario invirtiendo el operador no igual a igual en este bucle.
Tenga en cuenta que el do/until El bucle le permite ejecutar algún código después de que cumpla con la condición que estaba buscando, una hazaña imposible con el do/while bucle.
Los bucles son esenciales en la creación de secuencias de comandos para la automatización y el dominio del foreach, fory do Los bucles en PowerShell abren un mundo de posibilidades para manejar tareas complejas.
Ya sea que esté iterando a través de una lista de servidores, realizando comprobaciones en varios archivos o ejecutando acciones hasta que se cumpla una condición específica, estos bucles brindan flexibilidad y control. Le permiten agilizar sus procesos de manera efectiva.
Siguiendo estos ejemplos, ahora puede aplicar estos bucles a sus scripts, haciendo que sus tareas de automatización sean eficientes y escalables.
Leave a comment