Domine a Pausa no 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 aguardar a entrada do usuário, diminuir a velocidade de execução ou esperar que outro processo conclua antes de prosseguir. Como acontece com a 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 escolher terá seus pontos fortes e fracos. Adicionando mais uma opção às disponíveis está a nova capacidade multiplataforma do PowerShell. Como o PowerShell é frequentemente usado como uma forma de “colar” diferentes tecnologias juntas, 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 nativos, nos referimos a comandos que são funções ou métodos internos do PowerShell ou .NET. Métodos não nativos são definidos como programas específicos do Windows e do Linux que poderiam 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 ver, existem várias opções diferentes, cada uma com seus benefícios e desvantagens. Qual você usar irá influenciar como a execução é pausada e quais outros efeitos essa pausa pode incluir.

Métodos Nativos

Para começar, vamos começar a esboçar os métodos nativos, pois são os mais utilizados em scripts.

Start-Sleep

O comando de pausa mais comumente utilizado é, de longe, Start-Sleep. Este comando recebe dois inputs simples, que são -Seconds e -Milliseconds. Seconds pode ser um valor numérico System.Double, enquanto milliseconds aceita apenas valores System.Int32. Ao combinar os dois, controle preciso sobre o comprimento da pausa pode ser alcançado. Start-Sleep também possui um alias de sleep.

Start-Sleep -Seconds 2 -Milliseconds 300

Antes do PowerShell 6.2.0, você não seria capaz de escrever um valor fracionado de segundos, como 2.3, que é o mesmo comprimento de tempo que estamos pausando no código acima. Com a versão 6.2.0, valores fracionados agora são suportados, então em vez de escrever os segundos e milissegundos independentemente, você pode agora declarar: -Seconds 2.3.

É importante notar que você pode interromper 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 o seu processo.

Ao contrário do Start-Sleep, o método Thread Sleep não permite que você saia da rotina de suspensão 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 segundos. Como as contagens de thread sleep coincidem com os ticks do relógio, então 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 embutidos por causa desses problemas.

Read-Host

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

Read-Host é uma das formas 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 for inserido, é necessário pressionar a tecla Enter ou Return para avançar na 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ê quiser salvar o texto resultante inserido em uma variável para uso posterior, basta atribuir a entrada do 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 tecla, 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 Key, KeyChar e Modifiers, que podem ser muito úteis ao verificar determinadas combinações de teclas.

[Console]::ReadKey()
Console ReadKey Command

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

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

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

Método Host RawUI ReadKey

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

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

Há uma série de ReadKeyOptions que podem ser passadas, o que pode tornar o método RawUI ReadKey mais útil.

  • AllowCtrlC
  • IncludeKeyDown
  • IncludeKeyUp
  • NoEcho

Isso pode ser utilizado da seguinte maneira, incluindo eventos de tecla pressionada e sem exibir 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 utilizada.

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 de console não relacionados ao PowerShell, que podem ser integrados aos scripts do PowerShell dependendo das 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 estar se perguntando 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

Timeout

Geralmente usado em arquivos de lote do Windows, o comando timeout 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 se o período de tempo limite não tiver decorrido. Ele é usado de forma muito simples passando o número de segundos.

# Pausar por 2 segundos
timeout /t 2

# Pausar por 5 segundos, mas desativar a interrupção por tecla
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 suspensão. Ao contrário do comando de pausa, o comando sleep tem algumas opções a mais que permitem flexibilidade no tempo de suspensão.

sleep 2.3s
Sleep Command

O comando sleep também opcionalmente possui sufixos que permitem definir 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

Finalmente, outra maneira pela qual o Linux pode pausar é usando o aplicativo read para pausar até que a tecla Enter seja pressionada para continuar a execução. Existe um parâmetro de timeout 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 quase qualquer ambiente e utilidade máxima de script.

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