Olá pessoal! Tudo bem? Espero que sim!

Seguindo com a nossa jornada de imersão ao Powershell, hoje vamos aprender a realizar operações que se repetem em um significativo número de vezes utilizando os operadores For e Foreach.

Ambos operadores For ou Foreach servem como um excelente recurso para realizar operações em loop, ou seja, executar um comando quando os valores fornecidos através de uma lista atenderem a um critério ou mesmo quando você simplesmente precisa executar o mesmo comando diversas vezes com valores diferentes.

O que é um Loop?

O conceito de Loop é um dos mais importantes em linguagem de programação e são comumente utilizados na elaboração de uma instrução automatizada. Em uma estrutura de loop, será realizado uma pergunta ou uma afirmação. Se for uma pergunta e a resposta afirmativa exigir uma ação, ela será executada. A mesma pergunta será feita repetidamente até que nenhuma ação adicional seja necessária. No caso de uma afirmação, será executada a ação conforme a declaração afirmada para cada item. Chamamos de iteração o momento em que cada vez uma pergunta ou afirmação é feita.

Além do For e ForEach, também podemos citar o Do, While, Until, que veremos em um futuro post, como operadores para realização de loops no Powershell.

For

O operador For é utilizado para realizar operações sempre que uma condição lógica for atendida, ou seja, quando o teste lógico retornar $true.

Sintaxe: For (<valor inicial>; <condição lógica>; <operação de repetição>) { <instruções> }

O valor inicial representa os comandos ou estado inicial do loop. Geralmente declaramos ou retornamos através de um cmdlet um valor para uma variável. Esta variável fará parte da condição lógica que retornará um valor booleano (Verdadeiro ou Falso). A execução do For acontecerá enquanto esta condição lógica retornar Verdadeiro. Quando for retornado Falso, a execução do script será encerrada. A operação de repetição lhe permite executar um ou mais comandos enquanto o loop se repetir. É possível por exemplo, mudar o estado da variável inicial, seja adicionando um valor, incrementando um caractere ou mesmo executar um processo até que a condição lógica não seja mais atendida. As instruções definidas também serão executadas sempre que a condição lógica retornar verdadeiro e são totalmente livres, podendo executar qualquer comando enquanto o teste lógico for atendido.

Exemplo:

Podemos realizar a leitura do script da seguinte forma: Para x igual a 0, enquanto a variável x for menor ou igual a 15, adicione 1 ao valor da variável x e diga qual é o seu valor. Como estamos trabalhando com números inteiros, declaramos que o valor inicial é 0, e como operação de repetição utiliza a própria variável inicial seguida do operador ++. O operador ++ incrementa 1 (inteiro) a uma variável ou objeto, logo, o script incrementou em 1 até o valor de x chegar a 15. Isto ocorreu justamente pela condição imposta, onde o valor de x deve ser menor ou igual ao declarado na condição.

Também podemos combinar múltiplos valores iniciais, múltiplas condições lógicas e múltiplas instruções para o For, para isto, basta separarmos por “,” cada declaração inicial, utilizar operadores condicionais para as condições e novamente “,” para as instruções.

Exemplo:

No exemplo acima, realizamos a declaração de dois valores distintos para as variáveis x e y, seguidos de uma condição lógica composta e uma ação para ambas as variáveis. Da mesma forma que o primeiro exemplo, o script foi adicionando uma unidade nas variáveis até suprirem a condição lógica.

Agora um ponto de vista prático: considerando que o Status do meu serviço do Windows Update está como “Stopped”, podemos definir a variável inicial $serviço retornando os valores do cmdlet Get-Service wuauserv; a condição:  $serviço.Status -eq “Running”;  a operação de repetição: Start-Service wuauserv; e instrução Write-Host $serviço.Name “: O serviço foi iniciado!”, seguido de novamente uma verificação do estado do serviço: $serviço = Get-Service wuauserv. Observe este script abaixo:

Neste exemplo, eu propositalmente parei o serviço do Windows Update e executei o script ForCmd.ps1. O loop percorreu duas vezes o script e exibiu a mensagem que o serviço iniciado. Normalmente, o loop deveria percorrer apenas uma vez e exibir a mensagem que o serviço foi iniciado. Visto que a condição lógica propositalmente não foi atendida, o operador de repetição entrou em ação e iniciou o serviço, mas como bem sabemos, dependendo de qual serviço do Windows estamos manipulando, pode ocorrer um pequeno delay de milissegundos até a efetiva inicialização e mudança de Status para “Running”.

Este último exemplo não parece ser muito prático, visto que poderíamos simplesmente utilizar o cmdlet Start-Service diretamente para iniciar o serviço, mas foi um bom exemplo para sensibilizá-los que o For não precisa ser necessariamente utilizado apenas para operações com números inteiros ou cadeias de caracteres com o objetivo de incrementar valores, então procurem praticar o que sempre digo: deixem a imaginação fluir e utilizem este mecanismo a seu favor quando você precisar criar uma lógica que lhe faça sentido.

ForEach

O operador ForEach é utilizado para percorrer uma lista, tabela de itens ou conjunto de objetos e executar uma mesma operação considerando cada item desta lista, tabela ou objetos por vez.

Sintaxe: ForEach ($<variável que representa cada item> in $<variável com lista, tabela ou objeto>){ <instruções> }

Exemplo:

No exemplo acima, declaramos a operação Get-ChildItem, que retorna todos os arquivos de um diretório para a variável $Arquivos. Em seguida, referenciamos cada item retornado na consulta do Get-ChildItem através da variável $Arquivo. Para cada arquivo, a instrução considera um teste condicional que verifica a extensão do arquivo, se for um arquivo de texto, o caminho completo é exibido.

Também podemos repassar os dados retornados do comando Get-ChildItem através do Pipeline diretamente para o ForEach, porém, realizando a operação desta forma, você representa cada item retornado pela variável $_.

Exemplo:

Da mesma forma que podemos retornar os valores de um objetos em uma variável, podemos utilizar o ForEach para realizar operações em loop diretamente em um objeto.

Exemplo:

Conclusão

Você pode combinar a utilização do For ou Foreach sempre que você precisar realizar uma séries de operações repetitivas, seja alterando o estado de variáveis ou mesmo para realizar a mesma operação com valores distintos. Agora se coloque no lugar de um Sysadmin que realiza o gerenciamento de identidades com Active Directory. Você necessita adicionar a sequência de números iniciados em _001  no final do SamAccountName (Login) dos funcionários da sua empresa de acordo com a data de criação da Conta e ir incrementando 1 ao mais recente em relação ao último. Com o For, você pode colocar a condição lógica baseada em data e existência para realizar a operação de repetição de inclusão da sequência de números, enquanto existirem usuários com data superior ao atual, e ainda tem a possibilidade de colocar uma saída no host para ele escrever qual usuário está sendo alterado naquela rodada do loop. Outra situação: você precisa realizar a inclusão do Departamento de mil colaboradores um a um. Utilizando o ForEach, você consegue facilmente atribuir esta informação a todos de uma vez e com poucas linhas de código (em breve postarei scripts deste tipo por aqui). Fica a dica, procurem pensar sempre fora da caixa.

É isso aí galera, por hoje é só. Até o próximo post!

Dúvidas, sugestões, críticas? Entre em contato aqui!

Gostou? Deixe seu comentário e não se esqueçam de curtir a página do Facebook na barra lateral!