Je pense qu'il vaut la peine de récapituler/résumer les choix ici pour plus de clarté... puis de proposer une nouvelle variation qui, selon moi, offre la meilleure utilité.
<1> ReadKey (System.Console)
write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
- Avantage : Accepte n'importe quelle touche mais exclut correctement les touches modificatrices Shift, Alt, Ctrl.
- Inconvénient : Ne fonctionne pas dans PS-ISE.
<2> ReadKey (RawUI)
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
- Inconvénient : Ne fonctionne pas dans PS-ISE.
- Inconvénient : N'exclut pas les touches de modification.
<3> cmd
cmd /c Pause | Out-Null
- Inconvénient : Ne fonctionne pas dans PS-ISE.
- Inconvénient : Lance visiblement un nouveau shell/fenêtre lors de la première utilisation ; ne se remarque pas lors d'une utilisation ultérieure, mais présente tout de même des frais généraux.
<4> Read-Host
Read-Host -Prompt "Press Enter to continue"
- Avantage : Fonctionne dans PS-ISE.
- Désavantage : Accepte uniquement la touche Entrée.
<5> ReadKey composite
Il s'agit d'un composite de <1> ci-dessus avec la solution de contournement/kludge de l'ISE extrait de la proposition sur Le blog technologique d'Adam (courtoisie de Nick à partir de commentaires précédents sur cette page). J'ai apporté deux légères améliorations à cette dernière : j'ai ajouté Test-Path pour éviter une erreur si vous utilisez Set-StrictMode (vous le faites, n'est-ce pas ?!) et le dernier Write-Host pour ajouter une nouvelle ligne après votre frappe afin de placer l'invite au bon endroit.
Function Pause ($Message = "Press any key to continue . . . ") {
if ((Test-Path variable:psISE) -and $psISE) {
$Shell = New-Object -ComObject "WScript.Shell"
$Button = $Shell.Popup("Click OK to continue.", 0, "Script Paused", 0)
}
else {
Write-Host -NoNewline $Message
[void][System.Console]::ReadKey($true)
Write-Host
}
}
- Avantage : Accepte n'importe quelle touche mais exclut correctement les touches modificatrices Shift, Alt, Ctrl.
- Avantage : Fonctionne dans PS-ISE (mais seulement avec Enter ou un clic de souris)
- Inconvénient : Pas un seul mot !
2 votes
J'ai eu le même problème dans PowerShell ISE. Il fonctionne bien dans la console PowerShell standard.
3 votes
Je m'amuse juste avec powershell et c'est toujours aussi ennuyeux, même 2 ans et demi plus tard !
0 votes
Si vous lisez le Lien technique d'Adam ou le code dans Réponse de @Michael Sorens (à peu près à mi-chemin de la page au moment où j'écris ces lignes en 2020), vous découvrirez peut-être une technique consistant à envelopper votre pause dans
if (!$psise) { <# pause #> }
. Si vous êtes comme moi et que 99% de la raison pour laquelle vous voulez une pause est que vous pouvez lire l'écran avant qu'il ne clignote, alors ceci vous aidera, car si vous êtes dans l'ISE, il ne clignote pas et vous n'avez pas besoin de la pause.