Il existe de nombreuses raisons de mettre en pause l’exécution d’un script. Peut-être qu’un script doit attendre une saisie utilisateur, ralentir la vitesse d’exécution ou attendre qu’un autre processus se termine avant de continuer. Comme pour la plupart des tâches dans Powershell, il existe plus d’une façon de mettre en pause un script. Selon ce que vous essayez d’accomplir, la méthode de pause que vous choisissez aura ses forces et ses faiblesses. Ajoutant une autre complexité aux options disponibles est la nouvelle capacité multiplateforme de PowerShell. Étant donné que PowerShell est souvent utilisé comme un moyen de « coller » différentes technologies ensemble, tout comme dans Windows, la ligne de commande Linux a ses options pour mettre en pause l’exécution, qui peuvent également être incorporées dans PowerShell.
Méthodes de pause PowerShell
Quelles sont les différentes façons de mettre en pause l’exécution d’un script ? Dans cet article, nous allons décomposer la capacité de pause en commandes natives et non natives. Par natif, nous faisons référence à ces commandes qui sont des fonctions ou méthodes intégrées à PowerShell ou .NET. Les méthodes non natives sont définies comme des programmes spécifiques à Windows et Linux qui pourraient être utilisés en conjonction avec PowerShell.
Méthodes natives
Start-Sleep
[System.Threading.Thread]::Sleep()
Read-Host
[Console]::ReadKey()
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Méthodes non natives
Windows
pause
timeout
Linux
sleep
read -p
Comme vous pouvez le constater, il existe plusieurs options différentes, chacune avec ses avantages et ses inconvénients. Le choix que vous faites influencera la manière dont l’exécution est suspendue et quels autres effets cette pause peut inclure.
Méthodes natives
Pour commencer, nous allons commencer par décrire les méthodes natives car elles sont les plus utilisées dans les scripts.
Start-Sleep
La commande de pause la plus couramment utilisée est de loin Start-Sleep
. Cette commande prend deux entrées simples, qui sont -Seconds
et -Milliseconds
. Les secondes peuvent être une valeur de type System.Double
tandis que les millisecondes ne prennent que des valeurs de type System.Int32
. En combinant les deux, un contrôle précis sur la durée de la pause peut être obtenu. Start-Sleep
a également un alias sleep
.
Avant PowerShell 6.2.0, vous ne pouviez pas écrire une valeur de secondes fractionnaires comme 2.3
qui est la même durée que celle pour laquelle nous faisons une pause dans le code ci-dessus. Avec 6.2.0, les valeurs fractionnaires sont désormais prises en charge, donc au lieu d’écrire les secondes et les millisecondes indépendamment, vous pouvez maintenant spécifier : -Seconds 2.3
.
Il est important de noter que vous pouvez interrompre une fonction
Start-Sleep
en utilisantCtrl-C
. Ce n’est pas vrai pour toutes les méthodes !
Dormir du fil
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:
Pour utiliser un constructeur de laps de temps avec la méthode Dormir du fil, vous pouvez faire ce qui suit:
Pour mettre en pause indéfiniment un fil, vous pouvez utiliser [System.Threading.Timeout]::InfiniteTimeSpan
, mais gardez à l’esprit que cela peut bloquer votre processus.
Contrairement à
Start-Sleep
, la méthode Dormir du fil ne vous permet pas de sortir de la routine de sommeil en utilisantCtrl-C
. Selon votre application, cela peut être préférable.
Il est également important de savoir que Dormir du fil ne garantit pas une exactitude du temps. Tous les temps de sommeil des fils ont la garantie d’attendre au moins autant de secondes. Comme les comptes de sommeil des fils coïncident avec les impulsions d’horloge, d’autres programmes peuvent interrompre cette fonction de pause et forcer l’attente à prendre plus de temps.
Bien que Dormir du fil ait ses utilisations, il est préférable d’utiliser l’une des autres méthodes intégrées en raison de ces problèmes.
Read-Host
Les méthodes ci-dessus décrivent des façons de mettre en pause l’exécution, mais seulement pour une durée définie. L’autre moyen de mettre en pause l’exécution est de demander une entrée utilisateur. Avec cette méthode, une action manuelle doit être effectuée, mais elle peut être très utile pour exiger une confirmation pour continuer et éventuellement inclure une entrée supplémentaire.
Read-Host
est l’un des moyens les plus courants de demander une entrée utilisateur. En demandant une entrée utilisateur, l’entrée résultante peut être sauvegardée pour une utilisation ultérieure dans le code, ou pour mettre en pause l’exécution si nécessaire.
Une fois que du texte a été saisi, il est nécessaire d’appuyer sur la touche Entrée ou Retour pour faire avancer l’exécution. En le faisant, et sans sauvegarder l’entrée dans une variable, cela affichera le même texte saisi dans la console.

Si vous souhaitez sauvegarder le texte résultant saisi dans une variable pour une utilisation ultérieure, attribuez simplement l’entrée Read-Host
à une variable.
Parfois, vous souhaiterez peut-être lire l’entrée sous forme de chaîne sécurisée. Heureusement, Read-Host
rend cela extrêmement facile.
Ctrl-C
vous permettra de sortir de la fenêtre de saisieRead-Host
.
Méthode Console ReadKey
En utilisant la méthode [Console]::ReadKey()
, vous pouvez facilement lire les commandes de touche, ainsi que les modificateurs, tout en mettant en pause l’exécution du programme. Par défaut, les commandes de touche envoyées sont répercutées à l’écran sous la forme d’un objet System.ConsoleKeyInfo
. Cela inclut les valeurs Key
, KeyChar
, et les valeurs Modifiers
, qui peuvent être très utiles lors de la vérification de certaines combinaisons de touches.

Souvent, vous voudrez peut-être vérifier une certaine entrée de touche avant de passer continuellement. Cela peut facilement être fait en utilisant une boucle Do-While
comme ci-dessous.

Veuillez noter que, puisque nous recherchons une combinaison de touches spécifique,
Ctrl-C
ne permettra pas de sortir de l’entrée ici.
Méthode Host RawUI ReadKey
Enfin, nous avons la méthode $host.UI.RawUI.ReadKey()
. C’est similaire à la méthode Console ReadKey, mais elle permet de passer des options supplémentaires dans la méthode ReadKey pour contrôler le comportement et la sortie de manière plus approfondie.

Il existe plusieurs ReadKeyOptions
qui peuvent être utilisées, ce qui rend la méthode RawUI ReadKey plus utile.
AllowCtrlC
IncludeKeyDown
IncludeKeyUp
NoEcho
Cela peut être utilisé de la manière suivante, incluant les événements de pression de touche et n’affichant pas le texte.
Cette méthode permet l’utilisation de
Ctrl-C
pour sortir de la commande, sauf si l’optionAllowCtrlC
est utilisée.
Méthodes Non-Natives
Dans cette section, nous explorons quelques méthodes non natives pour mettre en pause l’exécution du script. Ces méthodes sont destinées à utiliser des utilitaires spécifiques à la console non liés à PowerShell et peuvent être intégrées dans des scripts PowerShell en fonction de vos besoins.
Windows
La commande pause est très simple et affichera Appuyez sur n'importe quelle touche pour continuer...
et restera ainsi jusqu’à ce qu’une touche soit pressée pour reprendre l’exécution.

Vous pouvez vous demander comment utiliser cela dans un script, mais tout comme vous le feriez avec n’importe quelle autre commande, insérez la commande cmd /c 'pause'
dans votre script pour utiliser la fonctionnalité native.

Typiquement utilisée dans les fichiers batch Windows, la commande timeout permet de mettre en pause pendant un nombre spécifié de secondes et d’ignorer éventuellement toute commande clavier. Une pression sur une touche par l’utilisateur reprendra généralement l’exécution même si la période de temporisation n’est pas écoulée. Elle est très simplement utilisée en passant le nombre de secondes en paramètre.

Tout comme avec la commande pause
, insérez la commande timeout
dans le script et dans l’exemple ci-dessous, nous appuyons sur la touche Entrée pour continuer.

Linux
Comme la commande pause
dans Windows, la commande sleep
dans Linux permet de définir une valeur arbitraire pour la pause. Contrairement à la commande pause, la commande sleep
offre quelques options supplémentaires permettant une flexibilité dans la durée de la pause.

Le commandement sleep
a également facultativement des suffixes qui permettent de définir des périodes plus longues. Exemples :
sleep 1m
– Dormir pendant une minutesleep 2h
– Dormir pendant deux heuressleep 1d
– Dormir pendant un jour
Enfin, une autre manière pour Linux de faire une pause est d’utiliser l’application read
pour mettre en pause jusqu’à ce que la touche Entrée soit pressée pour continuer l’exécution. Il existe un paramètre de temporisation facultatif qui poursuivra l’exécution si la touche Entrée n’est pas pressée dans le délai spécifié.

Conclusion
Comme vous pouvez le constater, il existe de nombreuses façons de mettre en pause l’exécution dans un script ou sur la ligne de commande. Selon vos besoins, cela pourrait être aussi simple qu’une commande Start-Sleep
ou un processus plus complexe basé sur l’entrée. Associée à des commandes natives, la pause PowerShell offre une flexibilité dans presque n’importe quel environnement et une utilité maximale pour les scripts.