Examinar e usar o loop ForEach nos scripts do Windows PowerShell
Quando você executa o piping, os comandos no pipeline são aplicados a cada objeto. Em alguns casos, talvez seja necessário usar o cmdlet ForEach-Object para processar os dados no pipeline. Quando você armazena dados em uma matriz, o constructo ForEach permite que você processe cada item na matriz.
O constructo ForEach usa a seguinte sintaxe:
ForEach ($user in $users) {
Set-ADUser $user -Department "Marketing"
}
No exemplo anterior, há uma matriz denominada $users que contém objetos de usuário do AD DS (Active Directory Domain Services). O constructo ForEach processa os comandos do Windows PowerShell entre as chaves uma vez para cada objeto. Quando os comandos estão sendo processados, $user é a variável que contém cada item da matriz. Na primeira iteração, $user contém $users[0], e na segunda iteração, $user contém $user[1]. Isso continuará até que todos os itens na matriz sejam processados uma vez.
Em um script, o constructo ForEach é a maneira mais comum de processar itens que você colocou em uma matriz. É fácil de usar porque você não precisa saber o número de itens para processá-los.
O exemplo anterior tem apenas um comando entre as chaves, mas você pode adicionar muitos comandos, que serão processados para cada loop. O recuo dos comandos entre as chaves é por convenção para facilitar a revisão do script. O recuo não é um requisito técnico, mas é uma prática recomendada.
A nomenclatura de variáveis no loop ForEach deve ser significativa. Na maioria das vezes, você identifica claramente a variável usada no loop como uma única instância da matriz. Por exemplo, para uma matriz denominada $users, a variável usada no loop pode ser $user. Você pode notar exemplos de variáveis com uma única letra que é a mesma que a letra inicial da matriz. No entanto, isso só deve ser usado em um código simples em que é fácil dizer que eles estão relacionados.
Desempenho paralelo
No PowerShell 7, o parâmetro -Parallel foi adicionado ao cmdlet ForEach-Object. Isso permite que o pipeline processe vários objetos simultaneamente. Processar vários objetos simultaneamente pode fornecer melhor desempenho do que um loop ForEach padrão. Você deve considerar isso se estiver usando o PowerShell 7. O exemplo a seguir explica como usar o ForEach-Object com o parâmetro -Parallel.
$users | ForEach-Object -Parallel { Set-ADUser $user -Department "Marketing" }
Por padrão, o parâmetro -Parallel permite que cinco itens sejam processados por vez. Você pode modificar isso para ser maior ou menor usando o parâmetro -ThrottleLimit.