Come si esegue una "pausa" con PowerShell 2.0?


113

OK, lo sto perdendo. PowerShell mi dà fastidio. Vorrei che appaia una finestra di dialogo di pausa, ma non lo farà.

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

1
Ho avuto lo stesso problema in PowerShell ISE. Tuttavia, funziona bene nella console PowerShell standard.
Charles Anderson

3
Sto solo scherzando con PowerShell ed è ancora fastidioso da morire, anche 2 anni e mezzo dopo!
Bill K

Se leggi il collegamento Adam's Tech o il codice nella risposta di @Michael Sorens (circa a metà della pagina mentre scrivo questo nel 2020) potresti scoprire una tecnica per concludere la tua pausa if (!$psise) { <# pause #> }. Se sei come me e il 99% del motivo per cui desideri una pausa è che puoi leggere lo schermo prima che scompaia, allora questo ti aiuterà, perché se sei in ISE non lampeggia e non non serve la pausa
john v kumpf

Risposte:


88
cmd /c pause | out-null

(Non è il modo PowerShell, ma è molto più elegante.)

Salva gli alberi. Usa una battuta.


7
/ c Esegue il comando specificato da stringa e quindi termina | out-null converte l'output in out-null, dove non lo vedrai mai Se vuoi vedere il messaggio "Premi un tasto qualsiasi per continuare ...", rimuovi la pipe. Inoltre, questo non sembra funzionare in PowerShell ISE. Il processo si blocca semplicemente e non puoi premere alcun tasto. Qualche modo per aggirare questo?
Wouter

1

7
@ Nick sì, 47 righe di codice per sostituire "cmd / c pause | out-null", che suona come il modo PowerShell.
Bill K

@ BillK Il post che ho collegato alla domanda di Wouter risponde. Non sei d'accordo?
Nick

6
Non era un commento alla tua risposta, penso che tu abbia assolutamente ragione. È un commento su PowerShell. Sono moderatamente disgustato - non ho visto questa verbosità oscura così inutile da quando ho programmato in Cobol.
Bill K

234

Penso che valga la pena ricapitolare / riassumere le scelte qui per chiarezza ... quindi offrire una nuova variazione che credo fornisca la migliore utilità.

<1> ReadKey (System.Console)

write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
  • Vantaggio: accetta qualsiasi tasto ma esclude correttamente i tasti modificatori Maiusc, Alt, Ctrl.
  • Svantaggio: non funziona in PS-ISE.

<2> ReadKey (RawUI)

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  • Svantaggio: non funziona in PS-ISE.
  • Svantaggio: non esclude i tasti modificatori.

<3> cmd

cmd /c Pause | Out-Null
  • Svantaggio: non funziona in PS-ISE.
  • Svantaggio: avvia visibilmente una nuova shell / finestra al primo utilizzo; non si nota al successivo utilizzo ma ha ancora l'overhead

<4> Read-Host

Read-Host -Prompt "Press Enter to continue"
  • Vantaggio: funziona in PS-ISE.
  • Svantaggio: accetta solo il tasto Invio.

<5> ReadKey composito

Questo è un composto di <1> sopra con la soluzione ISE / kludge estratta dalla proposta sul blog tecnico di Adam (per gentile concessione di Nick dai commenti precedenti su questa pagina). Ho apportato due lievi miglioramenti a quest'ultimo: aggiunto Test-Path per evitare un errore se usi Set-StrictMode (lo fai, vero ?!) e il Write-Host finale per aggiungere una nuova riga dopo la pressione del tasto per inserire il prompt nel posto giusto.

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
    }
}
  • Vantaggio: accetta qualsiasi tasto ma esclude correttamente i tasti modificatori Maiusc, Alt, Ctrl.
  • Vantaggio: funziona in PS-ISE (anche se solo con Invio o clic del mouse)
  • Svantaggio: non una battuta!

9
Risposta migliore, soprattutto perché fornisce una soluzione che funziona ovunque
Petr

Bella risposta! Vorrei notare che l'aggiunta del AllowCtrlCparametro alla scelta 2 consente all'utente di fare clic su Ctrl + C senza terminare lo script. Tuttavia, questa scelta non esclude ancora correttamente il tasto modificatore Ctrl. (si comporta come se l'utente facesse clic solo sul tasto Ctrl) Riferimento: Microsoft TechNet - Windows PowerShell Suggerimento: premere un tasto qualsiasi per continuare
Oz Edri

2
Le opzioni 3 e 5 hanno un altro svantaggio: non funziona su Linux
bitbonk

43

Presumo che tu voglia leggere l'input dalla console. Se è così, usa Read-Host.


3
Idem - Forse aggiungi il testo del prompt rubato dal basso .. Read-Host -Prompt "Premi Invio per continuare"
Jon H

21

Le soluzioni come fanno cmd /c pausesì che un nuovo interprete dei comandi venga avviato ed eseguito in background. Sebbene accettabile in alcuni casi, questo non è proprio l'ideale.

Le soluzioni che utilizzano Read-Hostcostringono l'utente a premere Entere non sono realmente "qualsiasi tasto".

Questa soluzione ti darà una vera interfaccia "premi un tasto qualsiasi per continuare" e non avvierà un nuovo interprete, che essenzialmente imiterà il pausecomando originale .

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

Tecnicamente ISE è fuori portata perché la domanda originale chiedeva solo su Powershell 2.0 ed escludeva ISE. Se stai usando ISE, usa semplicemente un punto di interruzione.
Ro Yo Mi

4
1. Non sono d'accordo che ISE fosse fuori portata, ma ora è irrilevante. 2. Ho notato che non funziona nell'ISE per assistere i passanti su questa domanda.
Bill_Stewart

2

Oltre alla risposta di Michael Sorens :

<6> ReadKey in un nuovo processo

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • Vantaggio: accetta qualsiasi tasto ma esclude correttamente i tasti modificatori Maiusc, Alt, Ctrl.
  • Vantaggio: funziona in PS-ISE.

Funziona benissimo, ma fa apparire una nuova finestra di PowerShell, a meno che non -NoNewWindowsia stato aggiunto :)
jeuxjeux20

@ jeuxjeux20, grazie per il suggerimento, l'ho aggiunto al comando nella risposta.
iRon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.