Magic Quadrant™ para gerenciamento de acesso privilegiado 2025: Netwrix reconhecida pelo quarto ano consecutivo. Baixe o relatório.

Plataforma
Centro de recursosBlog
Dominando o PowerShell Sleep para Gerenciamento de Scripts

Dominando o PowerShell Sleep para Gerenciamento de Scripts

Feb 14, 2025

PowerShell’s Start-Sleep cmdlet pauses script execution for a defined time, helping manage timing, synchronization, and throttling. It supports seconds, milliseconds, or time spans (-Duration) and is often used in loops, scheduling, or waiting for resources. Alternatives like Read-Host enable interactive pauses. Best practices include breaking long sleeps into smaller intervals, avoiding Start-Sleep for condition checks, and preventing infinite loops or timeouts.

Por que você pode precisar pausar ou adiar em scripts do PowerShell

O cmdlet Start-Sleep no PowerShell pausa a execução de um script e espera por um tempo especificado. Usar pausas estrategicamente pode ajudar a garantir uma funcionalidade suave e prevenir erros, especialmente em scripts que dependem de sistemas externos ou eventos.

Aqui estão três dos principais motivos pelos quais você pode precisar usar um comando de pausa do PowerShell:

  • Aguardar por recursos — Muitos scripts interagem com recursos externos como arquivos, compartilhamentos de rede, bancos de dados e APIs. Esses recursos podem não estar imediatamente disponíveis quando o seu script começa a ser executado, ou podem precisar de algum tempo para responder. Por exemplo, se o seu script inicia um trabalho em segundo plano, você pode precisar pausar a execução do script para dar tempo ao trabalho de ser concluído antes de permitir que a execução do script continue.
  • Para limitar a operação de scripts — Scripts do PowerShell que chamam APIs, fazem solicitações de rede ou executam comandos em servidores remotos podem sobrecarregar os sistemas envolvidos, levando a conexões perdidas e outros erros. Pausas apropriadas no seu script ajudarão a evitar esses problemas. Limitar a execução de scripts é especialmente importante ao trabalhar com grandes conjuntos de dados ou realizar operações em massa.
  • Para sincronizar processos — Em muitos cenários de automação, o sucesso de um processo pode depender da conclusão de outro. Por exemplo, seu script pode precisar esperar para acessar dados até que outro processo tenha concluído seu trabalho nesses dados, ou pode precisar adiar operações adicionais para dar a outro serviço a chance de iniciar completamente.

Sintaxe do PowerShell Start-Sleep Cmdlet

Parâmetros Principais

A sintaxe do comando de espera do PowerShell Start-Sleep depende de como você deseja especificar a duração da pausa na execução do script PowerShell. Aqui estão as duas opções básicas:

  • -Seconds — Utilize este parâmetro para fazer uma pausa no PowerShell por segundos. O valor pode ser um inteiro, ou você pode usar um número com ponto flutuante se desejar uma pausa como 2,5 segundos. Aqui está a sintaxe:
      Start-Sleep -Seconds <number>
      
  • Milissegundos — Se deseja especificar o atraso do PowerShell em um script em milissegundos, use a sintaxe abaixo. Neste caso, o valor deve ser um inteiro.
      Start-Sleep -Milliseconds <integer>
      

Apelidos para Uso Abreviado

O comando sleep do Windows PowerShell suporta aliases abreviados para cada um desses parâmetros, que podem ser usados em vez dos nomes completos dos parâmetros:

  • -s for the -Seconds parameter
  • -ms for the -Milliseconds parameter

Por exemplo, aqui está como executar um comando “PowerShell wait 5 seconds”:

      Start-Sleep -s 5
      

E aqui está como fazer uma pausa de 500 milissegundos:

      Start-Sleep -ms 500
      

-Duração Parâmetro (PowerShell 7.3 e posteriores)

Como alternativa a especificar um número de segundos ou milissegundos, você pode usar o parâmetro -Duration para especificar um intervalo de tempo. Aqui está a sintaxe básica:

      Start-Sleep -Duration <TimeSpan>
      

Você pode criar um intervalo de tempo de duas maneiras principais:

  • Usando um formato de string (hh:mm:ss, dd.hh:mm:ss, etc.)
  • Usando o cmdlet New-TimeSpan cmdlet

Por exemplo, suponha que você queira definir um temporizador de espera do PowerShell para 1 minuto e 30 segundos. Uma opção é usar o formato hh:mm:ss assim:

      Start-Sleep -Duration '00:01:30'
      

Outra opção é usar o cmdlet New-TimeSpan da seguinte forma:

      $duration = New-TimeSpan -Minutes 1 -Seconds 30

Start-Sleep -Duration $duration
      

Exemplos do Cmdlet Start-Sleep no PowerShell

Os exemplos a seguir ilustram como pausar um script do PowerShell usando cada parâmetro.

Usando Segundos

Este script obtém a data e a hora, faz uma pausa por 5 segundos e depois obtém a nova data e a hora:

      Get-Date; Start-Sleep -Seconds 5; Get-Date
      

Usando segundos fracionários

O seguinte comando pausa a execução do script por 1,5 segundos:

      Start-Sleep -S 1.5
      
Image

Usando Milissegundos

O seguinte comando pausa a execução do script por 500 milissegundos:

      Start-Sleep -Milliseconds 500
      

Usando um Intervalo de Tempo

O seguinte script de pausa do PowerShell utiliza o parâmetro -Duration para pausar um script por 2 minutos:

      Write-Host "The script will pause for 2 minutes..."

Start-Sleep -Duration (New-TimeSpan -Minutes 2)

Write-Host "The pause is over, and the script continues."
      
Image

Casos de uso avançados para Start-Sleep

Pausando Entre Iterações de um Loop

Você pode pausar entre iterações de um loop usando Start-Sleep dentro do loop. Isso é especialmente útil quando você precisa esperar por recursos externos, simular comportamentos como solicitações de API ou limitar a execução do script.

Por exemplo, o script abaixo executará o loop while cinco vezes, fazendo uma pausa de 10 segundos após cada iteração:

      $counter = 1  # Initialize a counter

$maxIterations = 5  # Define the maximum number of iterations

while ($counter -le $maxIterations) {

    Write-Host "Iteration $counter: Working on the task..."

    # Add a 10-second pause between iterations

    Start-Sleep -Seconds 10 

    $counter++  # Increment the counter

}

Write-Host "All iterations are complete."
      

Para proporcionar uma melhor visibilidade na execução do script, executamo-lo no PowerShell ISE:

Image

Dormindo até um horário específico

Às vezes você precisa que tarefas sejam executadas em um horário específico do dia. Nesse caso, você pode usar os cmdlets Start-Sleep e Get-Date juntos.

Por exemplo, o seguinte script será executado imediatamente se já passou das 18h; caso contrário, ele esperará até as 18h para rodar:

      # Get the current date and time

$currentTime = Get-Date

# Define the target time for 6 PM

$targetTime = Get-Date -Hour 18 -Minute 0 -Second 0

# Check if the current time is already past 6 PM

if ($currentTime -ge $targetTime) {

    Write-Host "It's already past 6 PM. No need to pause."

} else {

    # Calculate the time difference until 6 PM

    $timeToSleep = $targetTime - $currentTime

    # Convert the time difference to total seconds

    $secondsToSleep = [math]::Ceiling($timeToSleep.TotalSeconds)

    Write-Host "The script will pause for $secondsToSleep seconds until 6 PM."

    # Sleep until 6 PM

    Start-Sleep -Seconds $secondsToSleep

}

Write-Host "It's now 6 PM or later. Continuing execution."
      

O resultado abaixo foi gerado ao executar este script às 4:22 AM:

Image

Técnicas Interativas de Pausa (Read-Host)

Sometimes you need to pause a script until the user presses a particular key or provides certain input, such as their password or the answer to a question. In those situations, use the Read-Host cmdlet rather than Start-Sleep.

Domine os Fundamentos do PowerShell Scripting

Faça o download do eBook para começar com scripts do PowerShell

Saiba mais

Pausando até que uma tecla seja pressionada

Eis como usar Read-Host para pausar um script até que a tecla Enter seja pressionada:

      Write-Host "The script is running. Press Enter to continue..."

Read-Host    # Waits for the user to press Enter

Write-Host "You pressed Enter. Continuing the script..."
      
Image

Solicitando Entrada do Usuário

É comum solicitar a confirmação do usuário antes de prosseguir com ações potencialmente destrutivas ou irreversíveis, como deletar arquivos ou realizar alterações no sistema.

O seguinte script solicita ao usuário que responda Sim ou Não e pausa até que uma resposta seja inserida:

      # Prompt user for confirmation

$userInput = Read-Host "Do you want to continue? (Yes/No)"

# Check the user's response

if ($userInput -eq "Yes" -or $userInput -eq "Y") {

    Write-Host "You chose to continue. Proceeding with the script..."

    # Insert the next steps of your script here

} elseif ($userInput -eq "No" -or $userInput -eq "N") {

    Write-Host "You chose not to continue. Exiting the script."

    # Optionally, you can exit the script or perform other actions

    exit

} else {

    Write-Host "Invalid input. Please enter 'Yes' or 'No'."

    # You can loop back and ask again or exit

}
      
Image

Exibindo barras de progresso e temporizadores regressivos com Start-Sleep

Pode ser útil fornecer aos usuários um feedback visual sobre a execução de um script PowerShell, especialmente operações de longa duração e loops. Duas opções são barras de progresso e temporizadores regressivos.

Barras de Progresso

Para exibir uma barra de progresso enquanto seu script executa uma operação demorada, use o cmdlet Write-Progress com Start-Sleep. Abaixo está um script ilustrando como exibir uma barra de progresso durante um atraso de 20 segundos no PowerShell:

      # Total duration for the operation in seconds

$totalDuration = 20

# Loop to simulate a long-running process

for ($i = 1; $i -le $totalDuration; $i++) {

    # Calculate the percent complete

    $percentComplete = ($i / $totalDuration) * 100

    # Display the progress bar

    Write-Progress -Activity "Processing..." -Status "Please wait..." -PercentComplete $percentComplete

    # Simulate work being done with Start-Sleep

    Start-Sleep -Seconds 1  # Sleep for 1 second

}

# Final message after the loop

Write-Host "Process complete!"
      

Se executarmos o script no PowerShell ISE, ele se parece com isto:

Image

A execução do script a partir da linha de comando resulta no seguinte:

Image

Temporizadores regressivos

Um temporizador regressivo mostra quanto tempo falta para a conclusão do script. O script abaixo demonstra como criar um temporizador regressivo juntamente com uma barra de progresso:

      # Total duration for the countdown in seconds

$totalDuration = 20

# Loop to simulate countdown with progress feedback

for ($i = $totalDuration; $i -ge 1; $i--) {

    # Calculate the percent complete

    $percentComplete = (($totalDuration - $i) / $totalDuration) * 100

    # Display the progress bar and countdown

    Write-Progress -Activity "Countdown Timer" -Status "Time remaining: $i second(s)" -PercentComplete $percentComplete

    # Simulate a 1 second delay

    Start-Sleep -Seconds 1

}

# Final message after the countdown

Write-Host "Countdown complete! Time's up."
      

Aqui está o que vemos se executarmos o script no PowerShell ISE:

Image

E aqui está uma captura de tela mostrando a execução a partir da linha de comando:

Image

Melhores práticas para usar Start-Sleep em scripts do PowerShell

As seguintes melhores práticas podem ajudá-lo a usar o comando de atraso do PowerShell Start-Sleep da forma mais eficaz:

  • Use Start-Sleep apenas quando necessário. Exemplos comuns incluem esperar por um serviço ou recurso. Além disso, pausas podem ajudar a evitar limites de taxa ou sobrecarga do servidor com chamadas de API.
  • Interrompa períodos longos de sono. Divida longas pausas do PowerShell em intervalos mais curtos e use Write-Progress para manter o usuário informado.
  • Não use Start-Sleep como substituto para uma verificação de condição. Por exemplo, não há necessidade de pausar seu script para verificar se um arquivo existe ou um processo foi concluído.

Erros comuns e armadilhas ao usar Start-Sleep

A seguir estão alguns dos problemas comuns a serem observados ao usar Start-Sleep:

  • Pausas de interrupção — Interromper uma pausa de Start-Sleep com Ctrl + C pode deixar recursos em um estado inconsistente. Para gerenciar tais interrupções e realizar as tarefas de limpeza necessárias, use tratamento de erros como blocos de try-catch ou $ErrorActionPreference.
  • Imprecisão da duração da pausa — O tempo relacionado ao Start-Sleep pode variar devido à sobrecarga do sistema e resultar em pequenos atrasos. Evite depender deste cmdlet para ações críticas de tempo ou considere usar intervalos mais curtos com verificações repetidas.
  • Laços infinitos — Ter comandos Start-Sleep dentro de um laço infinito pode causar exaustão de recursos. Para prevenir o uso excessivo de CPU e memória, defina condições claras de saída para os laços, use intervalos de espera apropriados e adicione tempos de espera.

Conclusão

Adicionar pausas estrategicamente aos seus scripts PowerShell é uma maneira eficaz de controlar o tempo, prevenir sobrecarga de recursos e gerenciar dependências entre tarefas. O cmdlet Start-Sleep pode ajudá-lo a evitar problemas como limitação de recursos, excesso de solicitações de API ou erros desnecessários no script. Se você precisa pausar um script até que o usuário pressione uma tecla específica ou forneça uma entrada determinada, use o cmdlet Read-Host.

Certifique-se de experimentar esses cmdlets juntamente com técnicas como processamento paralelo, script assíncrono e automação baseada em eventos para encontrar a melhor abordagem para tarefas específicas.

Garanta a Visibilidade Completa da Atividade do PowerShell

Detecte atividades suspeitas e garanta a conformidade no PowerShell com Netwrix Auditor

FAQ

Como faço para pausar um script do PowerShell por 10 segundos?

Você pode usar o cmdlet do PowerShell Start-Sleep para pausar um script por um número especificado de segundos ou milissegundos. Por exemplo, este comando irá pausar a execução do script por 10 segundos:

      Start-Sleep -Seconds 10
      

Como posso esperar pela entrada do usuário antes de retomar um script PowerShell?

Você pode usar o cmdlet Write-Host para solicitar a entrada do usuário e o cmdlet Read-Host para pausar a execução do script até que a resposta seja fornecida. Essa estratégia é frequentemente utilizada para coletar a senha do usuário ou a confirmação deles para prosseguir com uma operação.

O exemplo a seguir mostra como pausar seu script até que o usuário pressione a tecla Enter:

      Write-Host "The script is running. Press Enter to continue..."

Read-Host    # Waits for the user to press Enter

Write-Host "You pressed Enter. Continuing the script..."
      

Como eu configuro timeouts no PowerShell?

Para pequenos atrasos, você pode usar o cmdlet do PowerShell Start-Sleep. Mas para um verdadeiro controle de tempo de espera, especialmente para tarefas de longa duração, trabalhos em segundo plano ou comandos remotos, opções melhores incluem Wait-Job e System.Threading.Timer.

Experimente estes métodos para se adequar ao seu caso de uso específico!

Compartilhar em

Saiba Mais

Sobre o autor

Asset Not Found

Tyler Reese

VP de Gestão de Produto, CISSP

Com mais de duas décadas na indústria de segurança de software, Tyler Reese tem um conhecimento íntimo dos desafios de identidade e segurança que evoluem rapidamente e com os quais as empresas se deparam hoje. Atualmente, ele atua como diretor de produto para o portfólio de Netwrix Identity and Access Management, onde suas responsabilidades incluem avaliar tendências de mercado, definir a direção para a linha de produtos IAM e, em última análise, atender às necessidades dos usuários finais. Sua experiência profissional varia desde consultoria em IAM para empresas Fortune 500 até atuar como arquiteto empresarial de uma grande empresa de venda direta ao consumidor. Atualmente, ele possui a certificação CISSP.