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

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

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

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.

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

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.

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

O comando sleep
também opcionalmente possui sufixos que permitem definir períodos de tempo mais longos. Exemplos:
sleep 1m
– Dormir por um minutosleep 2h
– Dormir por duas horassleep 1d
– Dormir por um dia
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.

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.