Dominar PowerShell Sleep para la gestión 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 qué podría necesitar pausar o retrasar en scripts de PowerShell
El cmdlet Start-Sleep en PowerShell pausa la ejecución de un script y espera durante un tiempo especificado. Utilizar pausas estratégicamente puede ayudar a garantizar un funcionamiento fluido y prevenir errores, especialmente en scripts que dependen de sistemas externos o eventos.
Aquí tienes tres de las principales razones por las que podrías necesitar usar un comando de pausa de PowerShell:
- Para esperar recursos — Muchos scripts interactúan con recursos externos como archivos, recursos compartidos de red, bases de datos y APIs. Estos recursos podrían no estar inmediatamente disponibles cuando tu script comienza a ejecutarse, o podrían requerir algo de tiempo para responder. Por ejemplo, si tu script inicia un trabajo en segundo plano, podrías necesitar pausar la ejecución del script para darle tiempo al trabajo de completarse antes de permitir que la ejecución del script continúe.
- Para regular la operación del script — Los scripts de PowerShell que llaman a APIs, realizan solicitudes de red o ejecutan comandos en servidores remotos pueden sobrecargar los sistemas involucrados, lo que lleva a conexiones perdidas y otros errores. Pausas apropiadas en su script le ayudarán a evitar estos problemas. Regular la ejecución del script es especialmente importante cuando se trabaja con grandes conjuntos de datos o se realizan operaciones masivas.
- Para sincronizar procesos — En muchos escenarios de automatización, el éxito de un proceso puede depender de la finalización de otro. Por ejemplo, su script podría necesitar esperar para acceder a datos hasta que otro proceso haya completado su trabajo con esos datos, o podría necesitar retrasar operaciones adicionales para darle la oportunidad a otro servicio de iniciar completamente .
Sintaxis del Cmdlet de PowerShell Start-Sleep Cmdlet
Parámetros centrales
La sintaxis del comando de espera de PowerShell Start-Sleep depende de cómo desee especificar la duración de la pausa en la ejecución del script de PowerShell. Aquí están las dos opciones básicas:
- -Seconds — Utilice este parámetro para hacer que PowerShell haga una pausa por segundos. El valor puede ser un número entero, o puede usar un número con punto flotante si desea una pausa como de 2.5 segundos. Aquí está la sintaxis:
Start-Sleep -Seconds <number>
- Milisegundos — Si desea especificar el retraso de PowerShell en un script en milisegundos, utilice la siguiente sintaxis. En este caso, el valor debe ser un número entero.
Start-Sleep -Milliseconds <integer>
Alias para uso abreviado
El comando sleep de Windows PowerShell admite alias abreviados para cada uno de estos parámetros, que pueden utilizarse en lugar de los nombres completos de los parámetros:
- -s for the -Seconds parameter
- -ms for the -Milliseconds parameter
Por ejemplo, aquí se muestra cómo ejecutar un comando de “PowerShell wait 5 seconds”:
Start-Sleep -s 5
Y aquí está cómo hacer una pausa de 500 milisegundos:
Start-Sleep -ms 500
-Duración Parámetro (PowerShell 7.3 y posteriores)
Como alternativa a especificar un número de segundos o milisegundos, puede usar el parámetro -Duration para especificar un lapso de tiempo. Aquí está la sintaxis básica:
Start-Sleep -Duration <TimeSpan>
Puede crear un intervalo de tiempo de dos maneras principales:
- Usando un formato de cadena (hh:mm:ss, dd.hh:mm:ss, etc.)
- Usando el cmdlet New-TimeSpan cmdlet
Por ejemplo, supongamos que quieres establecer un temporizador de espera de PowerShell para 1 minuto y 30 segundos. Una opción es usar el formato hh:mm:ss de la siguiente manera:
Start-Sleep -Duration '00:01:30'
Otra opción es utilizar el cmdlet New-TimeSpan de la siguiente manera:
$duration = New-TimeSpan -Minutes 1 -Seconds 30
Start-Sleep -Duration $duration
Ejemplos del cmdlet Start-Sleep en PowerShell
Los siguientes ejemplos ilustran cómo pausar un script de PowerShell utilizando cada parámetro.
Usando segundos
Este script obtiene la fecha y la hora, se pausa durante 5 segundos y luego obtiene la nueva fecha y la hora:
Get-Date; Start-Sleep -Seconds 5; Get-Date
Usando fracciones de segundo
El siguiente comando pausa la ejecución del script por 1.5 segundos:
Start-Sleep -S 1.5
Usando milisegundos
El siguiente comando pausa la ejecución del script durante 500 milisegundos:
Start-Sleep -Milliseconds 500
Usando un intervalo de tiempo
El siguiente script de pausa de PowerShell utiliza el parámetro -Duration para pausar un script durante 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."
Casos de uso avanzados para Start-Sleep
Haciendo pausas entre iteraciones de un bucle
Puede hacer una pausa entre iteraciones de un bucle utilizando Start-Sleep dentro del bucle. Esto es especialmente útil cuando necesita esperar recursos externos, simular comportamientos como solicitudes de API o regular la ejecución del script.
Por ejemplo, el siguiente script ejecutará el bucle while cinco veces, haciendo una pausa de 10 segundos después de cada iteración:
$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 una mejor visibilidad en la ejecución del script, lo ejecutamos en el PowerShell ISE:
Durmiendo hasta una hora específica
A veces necesitas que las tareas se ejecuten en un momento específico del día. En ese caso, puedes usar los cmdlets Start-Sleep y Get-Date juntos.
Por ejemplo, el siguiente script se ejecutará inmediatamente si ya pasaron las 6 PM; de lo contrario, esperará hasta las 6 PM para ejecutarse:
# 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."
La salida a continuación fue generada al ejecutar este script a las 4:22 AM:
Técnicas de Pausa Interactiva (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.
Domina los fundamentos del scripting de PowerShell
Descarga el eBook para comenzar con el scripting de PowerShell
Aprende másPausando hasta que se presione una tecla
Aquí le mostramos cómo usar Read-Host para pausar un script hasta que se presione la 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..."
Solicitando la entrada del usuario
Es común solicitar la confirmación del usuario antes de proceder con acciones potencialmente destructivas o irreversibles, como eliminar archivos o realizar cambios en el sistema.
El siguiente script solicita al usuario que responda Sí o No y se pausa hasta que se ingresa una respuesta:
# 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
}
Mostrando barras de progreso y temporizadores de cuenta atrás con Start-Sleep
Puede ser útil proporcionar a los usuarios retroalimentación visual sobre la ejecución de un script de PowerShell, especialmente en operaciones de larga duración y bucles. Dos opciones son barras de progreso y temporizadores de cuenta regresiva.
Barras de progreso
Para mostrar una barra de progreso mientras su script ejecuta una operación que consume tiempo, utilice el cmdlet Write-Progress con Start-Sleep. A continuación se muestra un script que ilustra cómo mostrar una barra de progreso durante un retraso de 20 segundos en 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!"
Si ejecutamos el script en el PowerShell ISE, se ve así:
Ejecutar el script desde la línea de comandos produce lo siguiente:
Temporizadores de cuenta regresiva
Un temporizador de cuenta regresiva muestra cuánto tiempo queda antes de la finalización del script. El script a continuación demuestra cómo crear un temporizador de cuenta regresiva junto con una barra de progreso:
# 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."
Aquí está lo que vemos si ejecutamos el script en el PowerShell ISE:
Y aquí hay una captura de pantalla que muestra la ejecución desde la línea de comandos:
Mejores prácticas para usar Start-Sleep en scripts de PowerShell
Las siguientes mejores prácticas pueden ayudarte a utilizar el comando de retraso de PowerShell Start-Sleep de la manera más efectiva:
- Utilice Start-Sleep solo cuando sea necesario. Ejemplos comunes incluyen la espera por un servicio o recurso. Además, las pausas pueden ayudar a evitar límites de tasa o sobrecarga del servidor con llamadas a la API.
- Rompa los períodos largos de sueño. Divida las pausas largas de PowerShell en intervalos más cortos y use Write-Progress para mantener informado al usuario.
- No utilices Start-Sleep como sustituto de una comprobación de condición. Por ejemplo, no hay necesidad de pausar tu script para verificar si un archivo existe o un proceso ha finalizado.
Errores comunes y trampas al usar Start-Sleep
A continuación se presentan algunos de los problemas comunes a tener en cuenta al usar Start-Sleep:
- Pausas de interrupción — Interrumpir una pausa de Start-Sleep con Ctrl + C puede dejar los recursos en un estado inconsistente. Para gestionar tales interrupciones y realizar las tareas de limpieza necesarias, utilice el manejo de errores como bloques de try-catch o $ErrorActionPreference.
- Imprecisión de la duración de la pausa — El tiempo relacionado con Start-Sleep puede variar debido a la sobrecarga del sistema y resultar en ligeros retrasos. Evite depender de este cmdlet para acciones críticas de tiempo o considere usar intervalos más cortos con verificaciones repetidas.
- Bucles infinitos — Tener comandos Start-Sleep dentro de un bucle infinito puede causar agotamiento de recursos. Para prevenir el uso excesivo de CPU y memoria, defina condiciones de salida claras para los bucles, utilice intervalos de espera apropiados y agregue tiempos de espera.
Conclusión
Agregar pausas estratégicamente a tus scripts de PowerShell es una manera efectiva de controlar el tiempo, prevenir la sobrecarga de recursos y manejar las dependencias entre tareas. El cmdlet Start-Sleep puede ayudarte a evitar problemas como la limitación de recursos, exceso de solicitudes a la API o errores innecesarios en los scripts. Si necesitas pausar un script hasta que el usuario presione una tecla específica o proporcione cierta entrada, utiliza el cmdlet Read-Host.
Asegúrese de experimentar con estos cmdlets junto con técnicas como el procesamiento paralelo, el scripting asíncrono y la automatización basada en eventos para encontrar el mejor enfoque para tareas específicas.
Asegure una visibilidad completa de la actividad de PowerShell
Detecte actividades sospechosas y asegure el cumplimiento en PowerShell con Netwrix Auditor
FAQ
¿Cómo pauso un script de PowerShell durante 10 segundos?
Puede utilizar el cmdlet de PowerShell Start-Sleep para pausar un script durante un número especificado de segundos o milisegundos. Por ejemplo, este comando pausará la ejecución del script durante 10 segundos:
Start-Sleep -Seconds 10
¿Cómo puedo esperar la entrada del usuario antes de reanudar un script de PowerShell?
Puede utilizar el cmdlet Write-Host para solicitar la entrada del usuario y el cmdlet Read-Host para pausar la ejecución del script hasta que se proporcione la respuesta. Esta estrategia se utiliza a menudo para recoger la contraseña del usuario o su confirmación para proceder con una operación.
El siguiente ejemplo muestra cómo pausar tu script hasta que el usuario presione la 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..."
¿Cómo configuro los tiempos de espera en PowerShell?
Para simples retrasos, puedes usar el cmdlet de PowerShell Start-Sleep. Pero para un manejo real de tiempos de espera, especialmente para tareas de larga duración, trabajos en segundo plano o comandos remotos, las mejores opciones incluyen Wait-Job y System.Threading.Timer.
¡Experimenta con estos métodos para adaptarlos a tu caso de uso específico!
Compartir en
Aprende más
Acerca del autor
Tyler Reese
VP de Gestión de Producto, CISSP
Con más de dos décadas en la industria de la seguridad de software, Tyler Reese conoce íntimamente los desafíos de identidad y seguridad que evolucionan rápidamente a los que se enfrentan las empresas hoy en día. Actualmente, se desempeña como director de producto para el portafolio de Netwrix Identity and Access Management, donde sus responsabilidades incluyen evaluar tendencias del mercado, establecer la dirección de la línea de productos IAM y, finalmente, satisfacer las necesidades de los usuarios finales. Su experiencia profesional abarca desde la consultoría de IAM para empresas Fortune 500 hasta trabajar como arquitecto empresarial de una gran compañía de venta directa al consumidor. Actualmente posee la certificación CISSP.