PowerShell 7: Foreach-Objeto -Paralelo
Con PowerShell 7 se introdujo una nueva característica: Foreach-Object -Parallel. La función paralela acelerará los bucles en PowerShell. En esta publicación de blog compararé la técnica antigua con la nueva y estoy seguro de que el lector se llevará una sorpresa. Entremos.
Digamos que tiene un script con bucles y este script tarda mucho en completarse. Quiere que su secuencia de comandos se ejecute más rápido, pero ha descubierto que actualmente no existe una manera fácil de hacerlo.
Entonces es hora de cambiar a PowerShell 7, porque Foreach-Object -Parallel abre subprocesos paralelos e itera cada elemento del bucle en paralelo. Esto acelerará significativamente el tiempo de ejecución del bucle.
¿Qué es Foreach-Object-Parallel?
Foreach-Object -Parallel proporciona procesamiento paralelo de objetos de entrada. PowerShell sólo procesará 5 objetos de entrada a la vez. Este límite se puede aumentar con el parámetro -ThrottleLimit.
Ejemplo :
$test = 'sid-500.com','orf.at','8.8.8.8','cnn.com'
$test | ForEach-Object -Parallel {Test-Connection -TargetName $_}
Ahora vemos de qué utilidad es.
Comparando para cada | Foreach-Objeto | Foreach-Objeto -Paralelo
He preparado una muestra para una mejor comprensión. Haré un escaneo de puertos para probar si un puerto está abierto o no. Además, uso Measure-Command para medir cuánto tiempo se ejecutará el código. El objetivo es comparar la técnica antigua con la nueva.
para cada()
El primer código probará el host 192.0.78.24 (sid-500.com) con foreach(). Los números de puerto probados son 443 (HTTPS), 80 (HTTP), 53 (DNS) y 88 (Kerberos).
Measure-Command {
$port = '443','80','53','88'
foreach ($p in $port) {
Test-NetConnection -ComputerName 192.0.78.24 -Port $p -WarningAction Ignore
}} | Select-Object Minutes,Seconds
Aquí está el resultado:
Ok, eso tomó aproximadamente 1 minuto y 18 segundos. Por cierto, todos los códigos se ejecutaron en Visual Studio Code, que en ese momento era el editor predeterminado de PowerShell 7.
Foreach-Objeto
A continuación, probaré Foreach-Object sin procesamiento paralelo.
Measure-Command {
$port = '443','80','53','88'
$port |
ForEach-Object {Test-NetConnection -ComputerName 192.0.78.24 -Port $_ -WarningAction Ignore}
} | Select-Object Minutes,Seconds
Lo mismo aquí.
Lo que me lleva a la nueva característica.
Foreach-Objeto -Paralelo
En primer lugar, como se mencionó al principio, tenga en cuenta que Foreach-Object -Parallel está limitado a 5 bloques de script a la vez. Esta configuración se puede aumentar mediante el parámetro -ThrottleLimit. No hay problema aquí, solo usaré 4 objetos de procesamiento paralelo.
¿Qué ventajas de velocidad traerá? Aquí está en acción.
Measure-Command {
$port = '443','80','53','88'
$port |
ForEach-Object -Parallel {Test-NetConnection -ComputerName 192.0.78.24 -Port $_ -WarningAction Ignore}
} | Select-Object Minutes,Seconds
¡Esto es más del doble de rápido! ¡Fantástico!
Más información sobre la nueva función paralela aquí: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7
Diviértete acelerando tu script con PowerShell 7 y Foreach-Object -Parallel.


