Maîtriser la Pause PowerShell : Techniques de Ligne de Commande et de Script

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.

Start-Sleep -Seconds 2 -Milliseconds 300

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 utilisant Ctrl-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:

[System.Threading.Thread]::Sleep(2300)

Pour utiliser un constructeur de laps de temps avec la méthode Dormir du fil, vous pouvez faire ce qui suit:

[System.Threading.Thread]::Sleep([TimeSpan]::New(0, 0, 0, 2, 300))

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 utilisant Ctrl-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.

Read-Host -Prompt "Press any key to continue"

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.

Press Enter to Move Execution Along

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.

$Input = Read-Host -Prompt "Press any key to continue"

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.

$SecureInput = Read-Host -Prompt "Enter your password" -AsSecureString

Ctrl-C vous permettra de sortir de la fenêtre de saisie Read-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.

[Console]::ReadKey()
Console ReadKey Command

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.

Do {
	$Key = [Console]::ReadKey($True)
	Write-Host $Key.Key
} While ( $Key.Key -NE [ConsoleKey]::Escape )
Do-While Loop Key

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.

$host.UI.RawUI.ReadKey()
RawUI.ReadKey

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.

$host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

Cette méthode permet l’utilisation de Ctrl-C pour sortir de la commande, sauf si l’option AllowCtrlC 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

Pause

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.

cmd /c 'pause'
Pause Command

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.

Cmd/C Pause Command

Timeout

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.

# Pause de 2 secondes
timeout /t 2

# Pause de 5 secondes mais refuse les interruptions par touche
timeout /t 5 /nobreak

# Pause indéfinie jusqu'à ce qu'une touche soit pressée
timeout /t -1
Timeout Command

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.

Timeout Command Execution

Linux

Sleep

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.

sleep 2.3s
Sleep Command

Le commandement sleep a également facultativement des suffixes qui permettent de définir des périodes plus longues. Exemples :

  • sleep 1m – Dormir pendant une minute
  • sleep 2h – Dormir pendant deux heures
  • sleep 1d – Dormir pendant un jour

Lire -P

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é.

read -p 'Press enter to continue' -t 5
Read Application to Pause

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.

Source:
https://adamtheautomator.com/powershell-pause/