Maîtriser PowerShell Sleep pour la gestion 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.
Pourquoi vous pourriez avoir besoin de mettre en pause ou de retarder dans les scripts PowerShell
La cmdlet Start-Sleep dans PowerShell interrompt l'exécution d'un script et attend pendant une durée spécifiée. L'utilisation stratégique de pauses peut aider à garantir un fonctionnement fluide et prévenir les erreurs, en particulier dans les scripts qui dépendent de systèmes externes ou d'événements.
Voici trois des principales raisons pour lesquelles vous pourriez avoir besoin d'utiliser une commande de pause PowerShell :
- Pour attendre des ressources — De nombreux scripts interagissent avec des ressources externes telles que des fichiers, des partages réseau, des bases de données et des API. Ces ressources pourraient ne pas être immédiatement disponibles lorsque votre script commence à s'exécuter, ou elles pourraient nécessiter un certain temps pour répondre. Par exemple, si votre script déclenche un travail en arrière-plan, vous pourriez avoir besoin de mettre en pause l'exécution du script pour donner le temps à ce travail de se terminer avant de permettre la continuation de l'exécution du script.
- Pour réguler l'opération des scripts — Les scripts PowerShell qui appellent des API, effectuent des requêtes réseau ou exécutent des commandes sur des serveurs distants peuvent submerger les systèmes impliqués, entraînant des déconnexions et d'autres erreurs. Des pauses appropriées dans votre script vous aideront à éviter ces problèmes. La régulation de l'exécution des scripts est particulièrement importante lors du travail avec de grands ensembles de données ou lors de l'exécution d'opérations en masse.
- Pour synchroniser les processus — Dans de nombreux scénarios d'automatisation, le succès d'un processus peut dépendre de l'achèvement d'un autre. Par exemple, votre script pourrait devoir attendre pour accéder aux données jusqu'à ce qu'un autre processus ait terminé son travail sur ces données, ou il pourrait devoir retarder d'autres opérations pour donner à un autre service la chance de démarrer complètement .
Syntaxe du Cmdlet PowerShell Start-Sleep
Paramètres de base
La syntaxe de la commande PowerShell wait Start-Sleep dépend de la manière dont vous souhaitez spécifier la durée de la pause de l'exécution du script PowerShell. Voici les deux options de base :
- -Seconds — Utilisez ce paramètre pour provoquer une pause en PowerShell de quelques secondes. La valeur peut être un entier, ou vous pouvez utiliser un nombre à virgule flottante si vous souhaitez une pause comme 2,5 secondes. Voici la syntaxe :
Start-Sleep -Seconds <number>
- Millisecondes — Si vous souhaitez spécifier le délai PowerShell dans un script en millisecondes, utilisez la syntaxe ci-dessous. Dans ce cas, la valeur doit être un entier.
Start-Sleep -Milliseconds <integer>
Alias pour l'utilisation abrégée
La commande sleep de Windows PowerShell prend en charge des alias abrégés pour chacun de ces paramètres, qui peuvent être utilisés à la place des noms complets des paramètres :
- -s for the -Seconds parameter
- -ms for the -Milliseconds parameter
Par exemple, voici comment exécuter une commande « PowerShell wait 5 seconds » :
Start-Sleep -s 5
Et voici comment faire une pause de 500 millisecondes :
Start-Sleep -ms 500
-Durée Paramètre (PowerShell 7.3 et ultérieur)
Comme alternative à la spécification d'un nombre de secondes ou de millisecondes, vous pouvez utiliser le paramètre -Duration pour définir une durée. Voici la syntaxe de base :
Start-Sleep -Duration <TimeSpan>
Vous pouvez créer une durée de deux manières principales :
- Utilisation d'un format de chaîne (hh:mm:ss, dd.hh:mm:ss, etc.)
- Utilisation de la cmdlet New-TimeSpan cmdlet
Par exemple, supposons que vous voulez définir un minuteur de pause PowerShell pour 1 minute et 30 secondes. Une option consiste à utiliser le format hh:mm:ss comme ceci :
Start-Sleep -Duration '00:01:30'
Une autre option consiste à utiliser le cmdlet New-TimeSpan comme suit :
$duration = New-TimeSpan -Minutes 1 -Seconds 30
Start-Sleep -Duration $duration
Exemples de la commande Start-Sleep dans PowerShell
Les exemples suivants illustrent comment mettre en pause un script PowerShell en utilisant chaque paramètre.
Utilisation des secondes
Ce script obtient la date et l'heure, marque une pause de 5 secondes, puis obtient la nouvelle date et l'heure :
Get-Date; Start-Sleep -Seconds 5; Get-Date
Utilisation des secondes fractionnaires
La commande suivante met en pause l'exécution du script pendant 1,5 secondes :
Start-Sleep -S 1.5
Utilisation des millisecondes
La commande suivante met en pause l'exécution du script pendant 500 millisecondes :
Start-Sleep -Milliseconds 500
Utilisation d'une durée
Le script de pause PowerShell suivant utilise le paramètre -Duration pour mettre en pause un script pendant 2 minutes :
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."
Cas d'utilisation avancés pour Start-Sleep
Pause entre les itérations d'une boucle
Vous pouvez faire une pause entre les itérations d'une boucle en utilisant Start-Sleep à l'intérieur de la boucle. Cela est particulièrement utile lorsque vous devez attendre des ressources externes, simuler des comportements tels que des requêtes API ou réguler l'exécution d'un script.
Par exemple, le script ci-dessous exécutera la boucle while cinq fois, en marquant une pause de 10 secondes après chaque itération :
$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."
Pour offrir une meilleure visibilité de l'exécution du script, nous l'avons exécuté dans l'ISE de PowerShell :
Dormir jusqu'à une heure spécifique
Parfois, vous avez besoin que des tâches s'exécutent à un moment précis de la journée. Dans ce cas, vous pouvez utiliser les applets de commande Start-Sleep et Get-Date ensemble.
Par exemple, le script suivant s'exécutera immédiatement s'il est passé 18 heures ; sinon, il attendra 18 heures pour s'exécuter :
# 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 sortie ci-dessous a été générée en exécutant ce script à 4h22 :
Techniques de pause interactive (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.
Maîtrisez les bases du scripting PowerShell
Téléchargez l'eBook pour commencer avec le scripting PowerShell
En savoir plusEn pause jusqu'à ce qu'une touche soit pressée
Voici comment utiliser Read-Host pour mettre en pause un script jusqu'à ce que la touche Entrée soit pressée :
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..."
Demande de saisie utilisateur
Il est courant de demander confirmation à l'utilisateur avant de procéder à des actions potentiellement destructrices ou irréversibles, telles que la suppression de fichiers ou l'exécution de modifications du système.
Le script suivant invite l'utilisateur à répondre par Oui ou Non et se met en pause jusqu'à ce qu'une réponse soit saisie :
# 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
}
Affichage de barres de progression et de minuteries avec Start-Sleep
Il peut être utile de fournir aux utilisateurs un retour visuel sur l'exécution d'un script PowerShell, en particulier pour les opérations de longue durée et les boucles. Deux options sont les barres de progression et les compte à rebours.
Barres de progression
Pour afficher une barre de progression pendant que votre script exécute une opération longue, utilisez le cmdlet Write-Progress avec Start-Sleep. Voici un script illustrant comment afficher une barre de progression pendant un délai de 20 secondes dans 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 nous exécutons le script dans le PowerShell ISE, cela ressemble à ceci :
L'exécution du script depuis la ligne de commande produit ce qui suit :
Minuteries de compte à rebours
Un minuteur de compte à rebours indique le temps restant avant la fin du script. Le script ci-dessous montre comment créer un minuteur de compte à rebours accompagné d'une barre de progression :
# 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."
Voici ce que nous voyons si nous exécutons le script dans le PowerShell ISE :
Et voici une capture d'écran montrant l'exécution depuis la ligne de commande :
Meilleures pratiques pour l'utilisation de Start-Sleep dans les scripts PowerShell
Les meilleures pratiques suivantes peuvent vous aider à utiliser la commande de délai PowerShell Start-Sleep de la manière la plus efficace :
- Utilisez Start-Sleep uniquement lorsque c'est nécessaire. Des exemples courants incluent l'attente pour un service ou une ressource. De plus, les pauses peuvent aider à éviter les limites de taux ou la surcharge du serveur avec des appels API.
- Rompez les longues périodes de sommeil. Divisez les longues pauses PowerShell en intervalles plus courts et utilisez Write-Progress pour tenir l'utilisateur informé.
- N’utilisez pas Start-Sleep comme substitut à une vérification de condition. Par exemple, il n’est pas nécessaire de mettre en pause votre script pour vérifier si un fichier existe ou si un processus est terminé.
Pièges et embûches courants lors de l'utilisation de Start-Sleep
Voici quelques-uns des problèmes courants à surveiller lors de l'utilisation de Start-Sleep:
- Interruptions de pauses — Interrompre une pause Start-Sleep avec Ctrl + C peut laisser des ressources dans un état incohérent. Pour gérer de telles interruptions et effectuer les tâches de nettoyage nécessaires, utilisez la gestion des erreurs telles que les blocs try-catch ou $ErrorActionPreference.
- Imprécision de la durée de pause — Le temps associé à Start-Sleep peut varier en raison de la surcharge du système et entraîner de légers retards. Évitez de compter sur cette cmdlet pour des actions critiques en temps ou envisagez d'utiliser des intervalles plus courts avec des vérifications répétées.
- Boucles infinies — Avoir des commandes Start-Sleep à l'intérieur d'une boucle infinie peut provoquer l'épuisement des ressources. Pour éviter une utilisation excessive du CPU et de la mémoire, définissez des conditions de sortie claires pour les boucles, utilisez des intervalles de sommeil appropriés et ajoutez des délais d'expiration.
Conclusion
Ajouter stratégiquement des pauses à vos scripts PowerShell est un moyen efficace de contrôler le timing, de prévenir la surcharge des ressources et de gérer les dépendances entre les tâches. La cmdlet Start-Sleep peut vous aider à éviter des problèmes tels que la limitation des ressources, les demandes excessives d'API ou les erreurs de script inutiles. Si vous avez besoin de mettre en pause un script jusqu'à ce que l'utilisateur appuie sur une touche particulière ou fournisse une entrée spécifique, utilisez la cmdlet Read-Host.
Assurez-vous d'expérimenter avec ces cmdlets en parallèle avec des techniques telles que le traitement parallèle, le script asynchrone et l'automatisation pilotée par événements pour trouver la meilleure approche pour des tâches spécifiques.
Assurez une visibilité complète sur l'activité PowerShell
Détectez les activités suspectes et assurez la conformité dans PowerShell avec Netwrix Auditor
FAQ
Comment mettre en pause un script PowerShell pendant 10 secondes ?
Vous pouvez utiliser le cmdlet PowerShell Start-Sleep pour mettre en pause un script pendant un nombre spécifié de secondes ou de millisecondes. Par exemple, cette commande mettra en pause l'exécution du script pendant 10 secondes :
Start-Sleep -Seconds 10
Comment puis-je attendre une saisie de l'utilisateur avant de reprendre un script PowerShell ?
Vous pouvez utiliser la cmdlet Write-Host pour inviter l'utilisateur à saisir une entrée et la cmdlet Read-Host pour mettre en pause l'exécution du script jusqu'à ce que la réponse soit fournie. Cette stratégie est souvent utilisée pour recueillir le mot de passe de l'utilisateur ou sa confirmation pour poursuivre une opération.
L'exemple suivant montre comment mettre en pause votre script jusqu'à ce que l'utilisateur appuie sur la touche Entrée :
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..."
Comment définir des délais d'attente dans PowerShell ?
Pour de simples délais, vous pouvez utiliser le cmdlet PowerShell Start-Sleep. Mais pour une véritable gestion des délais d'attente, en particulier pour les tâches de longue durée, les travaux en arrière-plan ou les commandes à distance, de meilleures options incluent Wait-Job et System.Threading.Timer.
Expérimentez avec ces méthodes pour les adapter à votre cas d'utilisation spécifique !
Partager sur
En savoir plus
À propos de l'auteur
Tyler Reese
Vice-président de la gestion de produit, CISSP
Avec plus de deux décennies d'expérience dans l'industrie de la sécurité logicielle, Tyler Reese connaît intimement les défis d'identité et de sécurité en rapide évolution auxquels les entreprises sont confrontées aujourd'hui. Actuellement, il occupe le poste de directeur de produit pour le portefeuille Netwrix Identity and Access Management, où ses responsabilités incluent l'évaluation des tendances du marché, la définition de la direction de la gamme de produits IAM et, en fin de compte, la satisfaction des besoins des utilisateurs finaux. Son expérience professionnelle s'étend de la consultation en IAM pour des entreprises du Fortune 500 à l'architecture d'entreprise d'une grande société de vente directe aux consommateurs. Il détient actuellement la certification CISSP.
En savoir plus sur ce sujet
Supprimer le fichier avec Powershell s'il existe
PowerShell Write to File : "Out-File" et techniques de sortie de fichier
Comment créer de nouveaux utilisateurs Active Directory avec PowerShell
Comment exécuter un script PowerShell
Qu'est-ce que PowerShell ? Un guide complet de ses fonctionnalités et utilisations