Revisión y uso del bucle ForEach en scripts de Windows PowerShell
Al realizar la canalización, los comandos de la canalización se aplican a cada objeto. En algunos casos, es posible que tenga que usar el cmdlet ForEach-Object para procesar los datos de la canalización. Al almacenar datos en una matriz, la construcción ForEach permite procesar cada elemento de la matriz.
La construcción ForEach usa la sintaxis siguiente:
ForEach ($user in $users) {
Set-ADUser $user -Department "Marketing"
}
En el ejemplo anterior, hay una matriz denominada $users que contiene objetos de usuario de Active Directory Domain Services (AD DS). La ForEach construye procesa los comandos de Windows PowerShell entre las llaves una vez para cada objeto. Cuando se procesan los comandos, $user es la variable que contiene cada elemento de la matriz. En la primera iteración, $user contiene $users[0] y en la segunda iteración, $user contiene $user[1]. Esto continúa hasta que todos los elementos de la matriz se hayan procesado una vez.
En un script, la construcción ForEach es la forma más común de procesar los elementos que ha colocado en una matriz. Es fácil de usar porque no es necesario conocer el número de elementos para procesarlos.
El ejemplo anterior solo tiene un comando entre las llaves, pero puede agregar muchos comandos, que se procesarán para cada bucle. La sangría de comandos entre llaves se aplica por convención para facilitar la revisión del script. La sangría no es un requisito técnico, pero es una buena práctica.
La nomenclatura de variables en el bucle ForEach debe ser significativa. La mayoría de las veces, se identifica claramente la variable usada en el bucle como una única instancia de la matriz. Por ejemplo, para una matriz denominada $users, la variable usada en el bucle podría ser $user. Es posible que observe ejemplos de variables con una sola letra que es la misma que la letra inicial de la matriz. Sin embargo, esto solo debe usarse en código simple, donde es fácil saber que están relacionados.
Rendimiento paralelo
En PowerShell 7, el parámetro -Parallel se agregó al cmdlet ForEach-Object. Esto permite que la canalización procese varios objetos simultáneamente. El procesamiento de varios objetos simultáneamente puede proporcionar un mejor rendimiento que un bucle ForEach estándar. Debe tenerlo en cuenta si usa PowerShell 7. En el ejemplo siguiente se explica cómo usar forEach-Object con el parámetro -Parallel.
$users | ForEach-Object -Parallel { Set-ADUser $user -Department "Marketing" }
De forma predeterminada, el parámetro -Parallel permite procesar cinco elementos a la vez. Puede modificarlo para que sea mayor o menor mediante el parámetro -ThrottleLimit.