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
.
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
usandoCtrl-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:
Para usar um construtor de intervalo de tempo com o método Thread Sleep, você pode fazer o seguinte:
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 usandoCtrl-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.
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.

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.
Às vezes, você pode querer ler a entrada como uma sequência segura. Felizmente, Read-Host
torna isso trivialmente fácil.
Ctrl-C
permitirá que você saia do promptRead-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.

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.

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.

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.
Este método permitirá o uso de
Ctrl-C
para interromper o comando, exceto se a opçãoAllowCtrlC
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
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.

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.

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.

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

Linux
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.

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 minutosleep 2h
– Dormir por duas horassleep 1d
– Dormir por um dia
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.

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.