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:
1 2 3 4 5 6 7 8 9 |
$Processes = Get-Process ForEach($Process in $Processes){ Write-Host -ForegroundColor Yellow "Verificando o processo atual:" $Process.Name If ($Process.Name -eq "explorer"){ Write-Host -ForegroundColor Green "O explorer está em execução!" Break } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
PS C:\Users\RobotChicken> .\Find-ExplorerProcessBreak.ps1 Verificando o processo atual: AdminService Verificando o processo atual: ApplicationFrameHost Verificando o processo atual: AppVShNotify Verificando o processo atual: AppVShNotify Verificando o processo atual: armsvc Verificando o processo atual: backgroundTaskHost Verificando o processo atual: backgroundTaskHost Verificando o processo atual: core Verificando o processo atual: core Verificando o processo atual: csrss Verificando o processo atual: csrss Verificando o processo atual: ctfmon Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dptf_helper Verificando o processo atual: dwm Verificando o processo atual: esif_uf Verificando o processo atual: explorer O explorer está em execução! |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$Script:EssentialProcesses = @("notepad.exe","Calculator.exe","cmd.exe") $Script:ComputerProcesses = (Get-Process | Select Path | Split-Path -Leaf -ErrorAction SilentlyContinue) :processes Foreach($process in $EssentialProcesses){ While($process -notin $Script:ComputerProcesses){ If($process -like "notepad.exe"){ Get-Process $Script:EssentialProcesses[1].Trim(".exe") -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue Get-Process $Script:EssentialProcesses[2].Trim(".exe") -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue Start-Process $process Write-Host -ForegroundColor Yellow "O processo:" $process "não estava iniciado!" Break processes } If($process -like "Calculator.exe"){ $process = "calc.exe" Get-Process $Script:EssentialProcesses[2].Trim(".exe") -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue Start-Process $process Write-Host -ForegroundColor Yellow "O processo:" $process "não estava iniciado!" Break processes } If($process -like "cmd.exe"){ Start-Process $process Write-Host -ForegroundColor Yellow "O processo:" $process "não estava iniciado!" Break processes } } Write-Host -ForegroundColor Green "O processo:" $process "está iniciado!" } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PS C:\Users\RobotChicken> .\Start-SequentialProcesses.ps1 O processo: notepad.exe não estava iniciado! PS C:\Users\RobotChicken> .\Start-SequentialProcesses.ps1 O processo: notepad.exe está iniciado! O processo: calc.exe não estava iniciado! PS C:\Users\RobotChicken> .\Start-SequentialProcesses.ps1 O processo: notepad.exe está iniciado! O processo: Calculator.exe está iniciado! O processo: cmd.exe não estava iniciado! PS C:\Users\RobotChicken> .\Start-SequentialProcesses.ps1 O processo: notepad.exe está iniciado! O processo: Calculator.exe está iniciado! O processo: cmd.exe está iniciado! |
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:
1 2 3 4 5 6 7 8 9 |
$Processes = Get-Process ForEach($Process in $Processes){ Write-Host -ForegroundColor Yellow "Verificando o processo atual:" $Process.Name If ($Process.Name -eq "explorer"){ Write-Host -ForegroundColor Green "O explorer está em execução!" Continue } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
PS C:\Users\RobotChicken> .\Find-ExplorerProcessContinue.ps1 Verificando o processo atual: AdminService Verificando o processo atual: ApplicationFrameHost Verificando o processo atual: AppVShNotify Verificando o processo atual: AppVShNotify Verificando o processo atual: armsvc Verificando o processo atual: CompPkgSrv Verificando o processo atual: core Verificando o processo atual: core Verificando o processo atual: csrss Verificando o processo atual: csrss Verificando o processo atual: ctfmon Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dptf_helper Verificando o processo atual: dwm Verificando o processo atual: esif_uf Verificando o processo atual: explorer O explorer está em execução! Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: fontdrvhost Verificando o processo atual: fontdrvhost Verificando o processo atual: GoogleCrashHandler Verificando o processo atual: GoogleCrashHandler64 Verificando o processo atual: helper Verificando o processo atual: Idle Verificando o processo atual: igfxCUIService Verificando o processo atual: igfxEM Verificando o processo atual: IntelCpHDCPSvc Verificando o processo atual: IntelCpHeciSvc Verificando o processo atual: LockApp Verificando o processo atual: lsass Verificando o processo atual: Memory Compression Verificando o processo atual: Microsoft.Msn.Weather Verificando o processo atual: Microsoft.Photos Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: MsMpEng Verificando o processo atual: NisSrv Verificando o processo atual: OfficeClickToRun Verificando o processo atual: PinningConfirmationDialog Verificando o processo atual: powershell_ise Verificando o processo atual: PresentationFontCache Verificando o processo atual: RAVBg64 Verificando o processo atual: RAVBg64 Verificando o processo atual: Registry Verificando o processo atual: RemindersServer Verificando o processo atual: RtkAudioService64 Verificando o processo atual: RtkNGUI64 Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: SearchIndexer Verificando o processo atual: SearchUI Verificando o processo atual: SecurityHealthService Verificando o processo atual: SecurityHealthSystray Verificando o processo atual: services Verificando o processo atual: SettingSyncHost Verificando o processo atual: SgrmBroker Verificando o processo atual: ShellExperienceHost Verificando o processo atual: sihost Verificando o processo atual: SkypeApp Verificando o processo atual: SkypeBackgroundHost Verificando o processo atual: smartscreen Verificando o processo atual: smss Verificando o processo atual: spoolsv Verificando o processo atual: StartMenuExperienceHost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: SynTPEnh Verificando o processo atual: SynTPEnhService Verificando o processo atual: SynTPHelper Verificando o processo atual: System Verificando o processo atual: SystemSettings Verificando o processo atual: taskhostw Verificando o processo atual: taskhostw Verificando o processo atual: Taskmgr Verificando o processo atual: uTorrent Verificando o processo atual: utorrentie Verificando o processo atual: utorrentie Verificando o processo atual: Video.UI Verificando o processo atual: WavesSvc64 Verificando o processo atual: WavesSysSvc64 Verificando o processo atual: WindowsInternal.ComposableShell.Experiences.TextInput.InputApp Verificando o processo atual: wininit Verificando o processo atual: winlogon Verificando o processo atual: WinStore.App Verificando o processo atual: WINWORD Verificando o processo atual: WUDFHost Verificando o processo atual: WWAHost Verificando o processo atual: YourPhone Verificando o processo atual: YourPhoneServer |
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:
1 2 3 4 5 6 7 8 9 |
$Processes = Get-Process ForEach($Process in $Processes){ Write-Host -ForegroundColor Yellow "Verificando o processo atual:" $Process.Name If ($Process.Name -eq "explorer"){ Continue Write-Host -ForegroundColor Green "O explorer está em execução!" } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
PS C:\Users\RobotChicken> .\Find-ExplorerProcessContinue.ps1 Verificando o processo atual: AdminService Verificando o processo atual: ApplicationFrameHost Verificando o processo atual: AppVShNotify Verificando o processo atual: AppVShNotify Verificando o processo atual: armsvc Verificando o processo atual: CompPkgSrv Verificando o processo atual: core Verificando o processo atual: core Verificando o processo atual: csrss Verificando o processo atual: csrss Verificando o processo atual: ctfmon Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dllhost Verificando o processo atual: dptf_helper Verificando o processo atual: dwm Verificando o processo atual: esif_uf Verificando o processo atual: explorer Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: firefox Verificando o processo atual: fontdrvhost Verificando o processo atual: fontdrvhost Verificando o processo atual: GoogleCrashHandler Verificando o processo atual: GoogleCrashHandler64 Verificando o processo atual: helper Verificando o processo atual: Idle Verificando o processo atual: igfxCUIService Verificando o processo atual: igfxEM Verificando o processo atual: IntelCpHDCPSvc Verificando o processo atual: IntelCpHeciSvc Verificando o processo atual: LockApp Verificando o processo atual: lsass Verificando o processo atual: Memory Compression Verificando o processo atual: Microsoft.Msn.Weather Verificando o processo atual: Microsoft.Photos Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: msedge Verificando o processo atual: MsMpEng Verificando o processo atual: NisSrv Verificando o processo atual: OfficeClickToRun Verificando o processo atual: PinningConfirmationDialog Verificando o processo atual: powershell_ise Verificando o processo atual: PresentationFontCache Verificando o processo atual: RAVBg64 Verificando o processo atual: RAVBg64 Verificando o processo atual: Registry Verificando o processo atual: RemindersServer Verificando o processo atual: RtkAudioService64 Verificando o processo atual: RtkNGUI64 Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: RuntimeBroker Verificando o processo atual: SearchFilterHost Verificando o processo atual: SearchIndexer Verificando o processo atual: SearchProtocolHost Verificando o processo atual: SearchUI Verificando o processo atual: SecurityHealthService Verificando o processo atual: SecurityHealthSystray Verificando o processo atual: services Verificando o processo atual: SettingSyncHost Verificando o processo atual: SgrmBroker Verificando o processo atual: ShellExperienceHost Verificando o processo atual: sihost Verificando o processo atual: SkypeApp Verificando o processo atual: SkypeBackgroundHost Verificando o processo atual: smartscreen Verificando o processo atual: smss Verificando o processo atual: spoolsv Verificando o processo atual: StartMenuExperienceHost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: svchost Verificando o processo atual: SynTPEnh Verificando o processo atual: SynTPEnhService Verificando o processo atual: SynTPHelper Verificando o processo atual: System Verificando o processo atual: SystemSettings Verificando o processo atual: taskhostw Verificando o processo atual: taskhostw Verificando o processo atual: Taskmgr Verificando o processo atual: uTorrent Verificando o processo atual: utorrentie Verificando o processo atual: utorrentie Verificando o processo atual: Video.UI Verificando o processo atual: WavesSvc64 Verificando o processo atual: WavesSysSvc64 Verificando o processo atual: WindowsInternal.ComposableShell.Experiences.TextInput.InputApp Verificando o processo atual: wininit Verificando o processo atual: winlogon Verificando o processo atual: WinStore.App Verificando o processo atual: WINWORD Verificando o processo atual: WUDFHost Verificando o processo atual: WWAHost Verificando o processo atual: YourPhone Verificando o processo atual: YourPhoneServer |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$Script:EssentialProcess = @("notepad.exe","calc.exe","cmd.exe") $Script:ComputerProcesses = (Get-Process | Select Path | Split-Path -Leaf -ErrorAction SilentlyContinue) :processes Foreach($process in $EssentialProcess){ If($process -eq "calc.exe"){ $process = "Calculator.exe" } While($process -in $Script:ComputerProcesses){ Write-Host -ForegroundColor Green "O processo:" $process "está iniciado!" $Script:ComputerProcesses = (Get-Process | Select Path | Split-Path -Leaf -ErrorAction SilentlyContinue) Continue processes } While($process -notin $Script:ComputerProcesses){ If($process -eq "Calculator.exe"){ $process = "calc.exe" } Start-Process $process Write-Host -ForegroundColor Yellow "O processo:" $process "não estava iniciado!" Continue processes } } |
1 2 3 4 5 6 7 8 9 |
PS C:\Users\RobotChicken> .\Start-SequentialProcessesContinue.ps1 O processo: notepad.exe não estava iniciado! O processo: calc.exe não estava iniciado! O processo: cmd.exe não estava iniciado! PS C:\Users\RobotChicken> .\Start-SequentialProcessesContinue.ps1 O processo: notepad.exe está iniciado! O processo: Calculator.exe está iniciado! O processo: cmd.exe está iniciado! |
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!
Show, meus Scripts são mais em ShellScript (um Portal) principalmente para servidores Unix.
Na minha já tem um cara muito fera em PowerShell. Estou contribuindo um pouco com alguns Scripts para inclusão deles no Portal que meu colega criou para nossos servidores Windows Server, e também já tenho alguns para meu próprio uso.
Lembro que um dos Scripts que criei, tinha uma grande dúvida, e que acabou sendo resolvida com um dos seus posts.
Parabéns meu amigo, você é fera.