Magic Quadrant™ pour la gestion des accès privilégiés 2025 : Netwrix reconnue pour la quatrième année consécutive. Téléchargez le rapport.

Plateforme
Centre de ressourcesBlog
Maîtriser PowerShell Sleep pour la gestion de scripts

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
      
Image

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

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 :

Image

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 :

Image

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 plus

En 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..."
      
Image

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

}
      
Image

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 :

Image

L'exécution du script depuis la ligne de commande produit ce qui suit :

Image

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 :

Image

Et voici une capture d'écran montrant l'exécution depuis la ligne de commande :

Image

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

Asset Not Found

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.