Domine a Pausa do PowerShell: Técnicas de Linha de Comando e Scripting

Existem muitas razões para pausar a execução de um script. Talvez um script precise esperar pela entrada do usuário, diminuir a velocidade de execução ou aguardar que outro processo termine antes de prosseguir. Como na maioria das tarefas no PowerShell, há mais de uma maneira de pausar um script. Dependendo do que você está tentando realizar, o método de pausa que você escolher terá seus pontos fortes e fracos. Adicionando mais uma opção às opções disponíveis está a nova capacidade multiplataforma do PowerShell. Como o PowerShell é frequentemente usado como uma forma de “colar” diferentes tecnologias, assim como no Windows, a linha de comando do Linux tem suas opções para pausar a execução que também podem ser incorporadas ao PowerShell.

Métodos de Pausa do PowerShell

Quais são as diferentes maneiras de pausar a execução de um script? Neste artigo, vamos dividir a capacidade de pausa em comandos nativos e não nativos. Por nativo, nos referimos a comandos que são funções ou métodos integrados do PowerShell ou .NET. Métodos não nativos são definidos como programas específicos do Windows e Linux que podem ser usados em conjunto com o PowerShell.

Métodos Nativos

  • Start-Sleep
  • [System.Threading.Thread]::Sleep()
  • Read-Host
  • [Console]::ReadKey()
  • $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Métodos Não Nativos

Windows

  • pause
  • timeout

Linux

  • sleep
  • read -p

Como você pode perceber, existem várias opções diferentes, cada uma com seus benefícios e desvantagens. Qual você escolhe usar influenciará como a execução é pausada e quais outros efeitos essa pausa pode incluir.

Métodos Nativos

Para começar, vamos começar delineando os métodos nativos, pois são os mais usados em scripts.

Start-Sleep

O comando de pausa mais comumente usado é, de longe, Start-Sleep. Este comando recebe dois inputs simples, que são -Seconds e -Milliseconds. Seconds pode ser um valor numérico do tipo System.Double, enquanto milliseconds aceita apenas valores do tipo System.Int32. Combinando os dois, é possível ter controle preciso sobre o comprimento da pausa. Start-Sleep também tem um alias chamado sleep.

Start-Sleep -Seconds 2 -Milliseconds 300

Antes do PowerShell 6.2.0, você não seria capaz de escrever um valor fracionário em segundos, como 2.3, que é o mesmo tempo de pausa que estamos usando no código acima. Com o 6.2.0, valores fracionários agora são suportados, então, em vez de escrever os segundos e milissegundos independentemente, agora você pode declarar: -Seconds 2.3.

É importante observar que você pode sair de uma função Start-Sleep usando Ctrl-C. Isso não é verdade para todos os métodos!

Thread Sleep

A less commonly used method of pausing execution is the [System.Threading.Thread]::Sleep() .NET method. By passing in a System.Int32 or a TimeSpan value, this allows pausing of the current thread for a set amount of time. For example, to pause by that same amount of time, 2.3 seconds, as in our Start-Sleep example, we can write:

[System.Threading.Thread]::Sleep(2300)

Para usar um construtor de intervalo de tempo com o método Thread Sleep, você pode fazer o seguinte:

[System.Threading.Thread]::Sleep([TimeSpan]::New(0, 0, 0, 2, 300))

Para pausar indefinidamente uma thread, você pode usar o [System.Threading.Timeout]::InfiniteTimeSpan, mas tenha em mente que isso pode travar seu processo.

Ao contrário do Start-Sleep, o método Thread Sleep não permite que você saia da rotina de sono usando Ctrl-C. Dependendo da sua aplicação, isso pode ser preferível.

Também é importante saber sobre o thread sleep que não é uma garantia de tempo exato. Todo thread sleep tem a garantia de que esperará pelo menos aqueles muitos segundos. Como as contagens de thread sleep coincidem com os ticks do relógio, outros programas podem interromper essa função de pausa e forçar a espera a durar mais tempo.

Embora o thread sleep tenha seus usos, é melhor usar um dos outros métodos integrados por causa desses problemas.

Read-Host

Os métodos acima descrevem maneiras de pausar a execução, mas apenas por um tempo definido. A outra maneira de pausar a execução é solicitando a entrada do usuário. Com este método, uma ação manual deve ser realizada, mas pode ser muito útil exigir uma confirmação para continuar e potencialmente incluir entradas adicionais.

Read-Host é uma das maneiras mais comuns de solicitar a entrada do usuário. Ao solicitar a entrada do usuário, a entrada resultante pode ser salva para uso posterior no código ou para pausar a execução conforme necessário.

Read-Host -Prompt "Press any key to continue"

Depois que o texto é inserido, é necessário pressionar a tecla Enter ou Return para continuar a execução. Ao fazer isso e sem salvar a entrada em uma variável, o mesmo texto inserido será exibido no console.

Press Enter to Move Execution Along

Se você deseja salvar o texto resultante inserido em uma variável para uso posterior, basta atribuir a entrada de Read-Host a uma variável.

$Input = Read-Host -Prompt "Press any key to continue"

Às vezes, você pode querer ler a entrada como uma sequência segura. Felizmente, Read-Host torna isso trivialmente fácil.

$SecureInput = Read-Host -Prompt "Enter your password" -AsSecureString

Ctrl-C permitirá que você saia do prompt Read-Host.

Método Console ReadKey

Usando o método [Console]::ReadKey(), você pode facilmente ler comandos de teclas, juntamente com modificadores, enquanto pausa a execução do programa. Por padrão, os comandos de tecla enviados são ecoados de volta à tela como um objeto System.ConsoleKeyInfo. Isso inclui os valores de Key, KeyChar e Modifiers, que podem ser muito úteis ao verificar determinadas combinações de teclas.

[Console]::ReadKey()
Console ReadKey Command

Muitas vezes, você pode querer verificar uma determinada entrada de tecla antes de continuar. Isso pode ser facilmente feito usando um loop Do-While como abaixo.

Do {
	$Key = [Console]::ReadKey($True)
	Write-Host $Key.Key
} While ( $Key.Key -NE [ConsoleKey]::Escape )
Do-While Loop Key

Observe que, como estamos procurando uma combinação de teclas específica, Ctrl-C não irá interromper a entrada aqui.

Método de leitura de RawUI do Host

Por fim, temos o método $host.UI.RawUI.ReadKey(). Este é semelhante ao método Console ReadKey, mas este método permite passar opções adicionais para o método ReadKey para controlar o comportamento e a saída ainda mais.

$host.UI.RawUI.ReadKey()
RawUI.ReadKey

Existem várias ReadKeyOptions que podem ser passadas, o que pode tornar o método de leitura de RawUI mais útil.

  • AllowCtrlC
  • IncludeKeyDown
  • IncludeKeyUp
  • NoEcho

Isso pode ser usado da seguinte forma, incluindo os eventos de tecla pressionada e não ecoando o texto.

$host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

Este método permitirá o uso de Ctrl-C para interromper o comando, exceto se a opção AllowCtrlC for usada.

Métodos Não-Nativos

Nesta seção, exploramos alguns métodos não-nativos de pausar a execução do script. Esses métodos são destinados a utilizar utilitários específicos do console que não são nativos do PowerShell e que podem ser integrados a scripts do PowerShell, dependendo de suas necessidades.

Windows

Pausa

O comando de pausa é muito simples e exibirá Pressione qualquer tecla para continuar... e permanecerá assim até que uma tecla seja pressionada para retomar a execução.

cmd /c 'pause'
Pause Command

Você pode se perguntar como usar isso em um script, mas assim como faria com qualquer outro comando, insira o comando cmd /c 'pause' dentro do seu script para utilizar a funcionalidade nativa.

Cmd/C Pause Command

Tempo de espera

Geralmente usado em arquivos de lote do Windows, o comando de tempo de espera permite pausar por um número especificado de segundos e, opcionalmente, ignorar quaisquer comandos de tecla. Uma tecla pressionada pelo usuário normalmente retomará a execução, mesmo que o período de espera não tenha decorrido. É muito simples de usar, bastando passar o número de segundos.

# Pausar por 2 segundos
timeout /t 2

# Pausar por 5 segundos, mas impedir interrupções por teclas
timeout /t 5 /nobreak

# Pausar indefinidamente até que uma tecla seja pressionada
timeout /t -1
Timeout Command

Assim como com o comando pause, insira o comando timeout dentro do script e no exemplo abaixo, pressionamos a tecla Enter para continuar.

Timeout Command Execution

Linux

Sleep

Assim como o comando pause no Windows, o comando sleep no Linux permite definir um valor arbitrário para o tempo de espera. Ao contrário do comando de pausa, o comando sleep possui algumas opções adicionais que proporcionam flexibilidade no tempo de espera.

sleep 2.3s
Sleep Command

O comando sleep também possui opcionalmente sufixos que podem permitir a definição de períodos de tempo mais longos. Exemplos:

  • sleep 1m – Dormir por um minuto
  • sleep 2h – Dormir por duas horas
  • sleep 1d – Dormir por um dia

Leia -P

Por fim, outra maneira de pausar no Linux é usando o aplicativo read para pausar até que a tecla Enter seja pressionada para continuar a execução. Há um parâmetro de tempo opcional que continuará a execução se a tecla Enter não for pressionada dentro do tempo especificado.

read -p 'Press enter to continue' -t 5
Read Application to Pause

Conclusão

Como você pode ver, existem muitas maneiras de pausar a execução dentro de um script ou na linha de comando. Dependendo das suas necessidades, pode ser tão simples quanto um comando Start-Sleep ou um processo mais complexo orientado por entrada. Combinado com comandos nativos, a pausa do PowerShell permite flexibilidade em praticamente qualquer ambiente e utilidade máxima do script.

Source:
https://adamtheautomator.com/powershell-pause/