Olá pessoal, espero encontrá-los bem!

Continuando a nossa jornada de imersão ao Powershell, hoje iremos abordar duas palavras-chave que podem ser utilizadas para determinar a continuidade de suas iterações durante operações de Loop em seu script.

Break

A palavra-chave Break pode ser utilizada para interromper uma operação de loop (For, ForEach ou Do-While) ou uma instrução do operador Switch.

Exemplo:

No exemplo acima, utilizamos o cmdlet Get-Process para retornar a lista de processos em execução no Windows na variável $Processes e em seguida iniciamos o loop Foreach onde, para cada linha da lista $Processes, representada pela variável $Process, será informado qual é o processo atual que está sendo verificado e realizará um simples teste condicional. Se o processo em execução for o explorer, será escrito no host da console que o processo está em execução e o loop do Foreach será interrompido imediatamente.

O Break pode ser muito útil quando estamos buscando determinados valores ou estados de configuração em uma grande lista de dados. Você pode por exemplo encontrar um parâmetro incorreto, parar por ali, tomar as ações necessárias e retomar a execução do script normalmente.

Rotulando Breaks (Labels)

Podem surgir alguns cenários em que precisamos desenvolver operações de loop incorporadas a outras operações de loop. Na prática, vamos incluir um loop dentro de outro loop. Estas operações podem ocorrer com os mesmos ou diferentes combinações de operadores de loop. Por exemplo: um ForEach, seguido de outro ForEach; um While, seguido de outro While; ou mesmo combinando o For, seguido de While; ou ForEach seguido de While.

Então, imagine o cenário em que você tem uma operação de loop que percorre uma lista de valores e a partir deste valor, percorrer outra lista de valores para buscar um critério. Se o critério for atendido, o loop inicial é interrompido. Utilizando rótulos (Labels) podemos nomear a operação de loop para depois referenciá-lo ao utilizar o Break.

Exemplo:

Neste exemplo mais complexo considerei o seguinte cenário: Tenho três processos que precisam ser iniciados na ordem declarada. Primeiro o bloco de notas, depois a calculadora e enfim o cmd. Um não pode ser iniciado antes do outro.

Para garantir que os três processos sempre estarão em execução e na sequência, declaramos uma array no escopo de Script*, onde definimos os três processos em questão. Em seguida, declaramos outra variável também no escopo de Script que consultará os processos através do cmdlet Get-Process. Então, declaramos um rótulo :processes para referenciar o Foreach loop. Dentro do Foreach, realizamos a inclusão de um segundo loop, desta vez, While sem rótulo que irá fazer uma comparação do processo atual no loop com os processos em execução.

A partir daí, realizamos testes condicionais para cada caso. Se o notepad não estiver em execução, ele tentará interromper alguma execução dos processos calculadora e cmd e em seguida, iniciará o processo do notepad. Se a calculadora não estiver em execução, o script tentará interromper alguma execução do processo do cmd e em seguida, iniciará o processo da calculadora. Se o cmd não estiver em execução, ele simplesmente iniciará, pois não há dependências. A todo o momento o script irá escrever no host o que está acontecendo e qual ação foi tomada.

Notem que quando vou parar um processo dependente antes de iniciar o processo soberano com os cmdlets Get e Stop-Process, inclui o parâmetro -ErrorAction SilentlyContinue, pois, se o processo eventualmente não estiver em execução, não será exibido alguma mensagem de erro que o processo não foi encontrado.

Enfim, a cada execução do script, ele validará as etapas da forma correta para iniciar cada fase da sua cadeia de processos estruturados e confirmar a plena execução.

* Caso não se lembre como utilizar Escopos no Powershell, dê uma olhada neste artigo!

Obs: Se repararem bem, este script foi desenvolvido para Windows 10+ ou Windows Server 2016+, pois a partir destas versões, o nome do processo da Calculadora se torna Calculator.exe e não calc.exe, como nas versões anteriores do Sistema Operacional. Entretanto, na hora que vou iniciar o processo, eu manipulo a variável e a declaro como calc.exe, pois, o diretório e o nome do aplicativo nativo continua o mesmo das versões anteriores para ser chamado através das variáveis de ambiente do Windows.

Continue

A palavra-chave Continue pode ser utilizada para ignorar a atual iteração da operação de loop (For, ForEach ou Do-While).

Exemplo:

Como podem observar, utilizei o mesmo exemplo abordado na explicação do Break. Contudo, desta vez o script percorreu todos os processos, encontrou e informou que o explorer estava em execução e continuou a percorrer o loop até o final.

Muito importante: Se o Continue ignora a iteração atual do loop, por que saiu no host da console o resultado da linha que informava que o explorer estava em execução?

Simples: Por que o Continue foi declarado após a interação ser processada, ou seja, no final.

Se alterarmos a posição do Continue para acima do Write-Host, a mensagem de execução do processo não será exibida.

Exemplo:

Como puderam observar, desta vez o script informou que estava verificando o processo explorer, e tudo certo até aí, por que esta iteração foi incluída fora do teste condicional, logo, executou antes do processamento do If onde consta o Continue. Desta forma, apesar do processo estar em execução, o script pulou a etapa de informar que de fato ele estava.

Rotulando Continue (Labels)

Assim como o Break, a palavra-chave Continue também permite a utilização de rótulos para organizar o escopo da efetividade da operação.

Exemplo:

Neste exemplo de utilização de rótulos com o Continue, utilizei um cenário parecido com o exemplo de Break Labels, contudo, neste cenário não temos dependência de uma aplicação à outra. Basicamente precisamos avaliar se os processos estão em execução e se um deles não estiver, informar e iniciar.

Desta vez utilizamos dois While dentro do loop Foreach para avaliar primeiro se cada processo está em execução, e enquanto não estiverem, iniciá-los e nos informar que o processo estava parado.

Obs: Não existe um limite de labels que você possa atribuir. Você pode rotular quantas operações de loops quiser em quantos níveis forem necessários e o interessante é que com o Break e Continue, você poderá iterar entre eles facilmente.

Conclusão

Agora que você chegou até aqui, está oficialmente apto a usar e abusar do Break e Continue sempre que lhe fizer sentido. Use sem medo. Continue incrementando operadores diferenciados, saia do básico If, Else e Foreach e tente olhar para o Do-While, Do-Until, While, Break, Continue e os diversos outros operadores e palavras-chave disponíveis que ainda iremos abordar por aqui para enriquecer cada vez mais a lógica de seus scripts e aumentar o poder de automação de rotinas com Powershell.

É 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!