140 votes

Comment faire une "Pause" avec PowerShell 2.0 ?

OK, je perds la tête. PowerShell m'agace. J'aimerais qu'un dialogue de pause apparaisse, mais il ne le fait pas.

PS W:\>>> $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Exception calling "ReadKey" with "1" argument(s): "The method or operation is not implemented."
At line:1 char:23
+ $host.UI.RawUI.ReadKey <<<< ("NoEcho")
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

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.

280voto

Michael Sorens Points 9637

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 !

9 votes

Meilleure réponse, surtout parce qu'elle fournit une solution qui fonctionne partout.

0 votes

Excellente réponse ! J'aimerais noter que l'ajout de l'élément AllowCtrlC au choix 2 permet à l'utilisateur de cliquer sur Ctrl + C sans mettre fin au script. Néanmoins, ce choix n'exclut toujours pas correctement la touche de modification Ctrl. (il agit comme si l'utilisateur ne cliquait que sur la touche Ctrl) Référence : Microsoft TechNet - Astuce Windows PowerShell : Appuyez sur n'importe quelle touche pour continuer

2 votes

Les options 3 et 5 présentent un autre inconvénient : elles ne fonctionnent pas sous linux.

98voto

Carlos Nunez Points 489
cmd /c pause | out-null

(Ce n'est pas la méthode PowerShell, mais c'est tellement plus élégant).

Sauvez les arbres. Utilisez des phrases toutes faites.

7 votes

/c Exécute la commande spécifiée par la chaîne puis se termine | out-null dirige la sortie vers out-null, où vous ne la verrez jamais Si vous voulez voir le message "Press any key to continue...", supprimez le pipe. De plus, cela ne semble pas fonctionner dans PowerShell ISE. Le processus se bloque et vous ne pouvez pas appuyer sur une touche. Y a-t-il un moyen de contourner ce problème ?

1 votes

9 votes

@Nick oui, 47 lignes de code pour remplacer "cmd /c pause | out-null", cela ressemble à la méthode PowerShell.

46voto

rerun Points 15285

Je suppose que vous voulez lire les entrées de la console. Si c'est le cas, utilisez Read-Host .

5 votes

Idem - Peut-être ajouter le texte d'invite chapardé ci-dessous Read-Host -Prompt "Appuyez sur Entrée pour continuer"

0 votes

Ne fait pas de pause pour moi pour une raison quelconque. J'appelle powershell à l'intérieur d'un .bat script.

22voto

Denomales Points 6276

Les solutions comme cmd /c pause provoquer le démarrage d'un nouvel interpréteur de commandes et son exécution en arrière-plan. Bien qu'acceptable dans certains cas, ce n'est pas vraiment l'idéal.

Les solutions utilisant Read-Host obliger l'utilisateur à appuyer sur Enter et ne sont pas vraiment "n'importe quelle clé".

Cette solution vous donnera une véritable interface "appuyez sur n'importe quelle touche pour continuer" et ne lancera pas un nouvel interpréteur, qui imitera essentiellement l'interface d'origine. pause commandement.

Write-Host "Press any key to continue..."
[void][System.Console]::ReadKey($true)

0 votes

Techniquement, ISE est hors du champ d'application, car la question initiale ne portait que sur Powershell 2.0 et excluait ISE. Si vous utilisez ISE, utilisez simplement un point d'arrêt.

4 votes

1. Je ne suis pas d'accord avec le fait que l'ISE était en dehors du champ d'application, mais cela n'a plus d'importance. 2. Je faisais remarquer que l'ISE ne fonctionne pas pour aider les passants à répondre à cette question.

5voto

iRon Points 41

En plus de Michael Sorens réponse :

<6> ReadKey dans un nouveau processus

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • Avantage : Accepte n'importe quelle touche mais exclut correctement les touches Shift, Alt, Ctrl les touches de modification.
  • Avantage : Fonctionne dans PS-ISE.

0 votes

Cela fonctionne très bien, mais fait apparaître une nouvelle fenêtre de powershell, à moins que -NoNewWindow a été ajouté :)

0 votes

@jeuxjeux20, merci pour la suggestion, j'ai ajouté cette commande dans la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X