Bagaimana Anda melakukan 'Jeda' dengan PowerShell 2.0?

113

Oke, saya kehilangannya. PowerShell mengganggu saya. Saya ingin dialog jeda muncul, dan tidak akan.

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
Derrick Bell
sumber
1
Saya mengalami masalah yang sama di PowerShell ISE. Bekerja dengan baik di konsol PowerShell standar.
Charles Anderson
3
Saya hanya mengotak-atik PowerShell dan itu masih sangat mengganggu, bahkan 2 1/2 tahun kemudian!
Bill K
Jika Anda membaca tautan Adam's Tech atau kode dalam jawaban @Michael Sorens (sekitar setengah halaman saat saya menulis ini pada tahun 2020), Anda mungkin menemukan teknik untuk menutup jeda Anda if (!$psise) { <# pause #> }. Jika Anda seperti saya dan 99% alasan Anda menginginkan jeda adalah agar Anda dapat membaca layar sebelum berkedip, maka ini akan membantu, karena jika Anda berada di ISE, layar tidak berkedip dan Anda tidak berkedip. tidak perlu jeda
john v kumpf

Jawaban:

88
cmd /c pause | out-null

(Ini bukan cara PowerShell, tapi jauh lebih elegan.)

Selamatkan pohon. Gunakan satu baris.

Carlos Nunez
sumber
7
/ c Melakukan perintah yang ditentukan oleh string dan kemudian mengakhiri | out-null menyalurkan output ke out-null, di mana Anda tidak akan pernah melihatnya Jika Anda ingin melihat pesan "Tekan sembarang tombol untuk melanjutkan ...", hapus pipa. Selain itu, ini sepertinya tidak berfungsi di PowerShell ISE. Prosesnya hanya macet, dan Anda tidak dapat menekan tombol apa pun. Ada cara lain?
Wouter
1
@Wouter Lihat posting blog ini: Cara Menjeda Skrip PowerShell dengan Benar
Nick
7
@Nick yes, 47 baris kode untuk menggantikan "cmd / c pause | out-null", itu terdengar seperti cara PowerShell.
Bill K
@BillK Pos yang saya tautkan untuk menjawab pertanyaan Wouter. Apakah Anda tidak setuju?
Nick
6
Itu bukan komentar atas jawaban Anda, saya pikir Anda sepenuhnya benar. Ini adalah komentar di PowerShell. Saya agak jijik - saya belum pernah melihat verbositas yang tidak berguna ini sejak saya memprogram di Cobol.
Bill K
234

Saya pikir ada gunanya merangkum / meringkas pilihan di sini untuk kejelasan ... kemudian menawarkan variasi baru yang saya percaya memberikan utilitas terbaik.

<1> ReadKey (System.Console)

write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
  • Keuntungan: Menerima tombol apa saja tetapi dengan tepat mengecualikan tombol pengubah Shift, Alt, Ctrl.
  • Kerugian: Tidak berfungsi di PS-ISE.

<2> ReadKey (RawUI)

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  • Kerugian: Tidak berfungsi di PS-ISE.
  • Kerugian: Tidak mengecualikan kunci pengubah.

<3> cmd

cmd /c Pause | Out-Null
  • Kerugian: Tidak berfungsi di PS-ISE.
  • Kerugian: Terlihat meluncurkan shell / jendela baru pada penggunaan pertama; tidak terlihat pada penggunaan selanjutnya tetapi masih memiliki overhead

<4> Host-Baca

Read-Host -Prompt "Press Enter to continue"
  • Keuntungan: Bekerja di PS-ISE.
  • Kerugian: Hanya menerima tombol Enter.

<5> Komposit ReadKey

Ini adalah gabungan dari <1> di atas dengan solusi ISE / kludge yang diambil dari proposal di Blog Teknologi Adam (atas izin Nick dari komentar sebelumnya di halaman ini). Saya membuat dua perbaikan kecil pada yang terakhir: menambahkan Test-Path untuk menghindari kesalahan jika Anda menggunakan Set-StrictMode (Anda melakukannya, bukan ?!) dan Write-Host terakhir untuk menambahkan baris baru setelah penekanan tombol Anda untuk meletakkan cepat di tempat yang tepat.

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
    }
}
  • Keuntungan: Menerima tombol apa saja tetapi dengan tepat mengecualikan tombol pengubah Shift, Alt, Ctrl.
  • Keuntungan: Bekerja di PS-ISE (meskipun hanya dengan Enter atau klik mouse)
  • Kerugian: Bukan one-liner!
Michael Sorens
sumber
9
Jawaban terbaik, terutama karena memberikan solusi yang berfungsi di mana
Petr
Jawaban yang bagus! Saya ingin mencatat bahwa menambahkan AllowCtrlCparameter ke pilihan 2 memungkinkan pengguna untuk mengklik Ctrl + C tanpa menghentikan skrip. Namun demikian, pilihan ini tetap tidak mengecualikan tombol pengubah Ctrl dengan benar. (Ini bertindak seolah-olah pengguna hanya mengklik tombol Ctrl) Referensi: Microsoft TechNet - Windows PowerShell Tip: Tekan Tombol Apa Saja untuk Melanjutkan
Oz Edri
2
Opsi 3 dan 5 memiliki kelemahan lain: tidak berfungsi di linux
bitbonk
43

Saya berasumsi bahwa Anda ingin membaca masukan dari konsol. Jika demikian, gunakan Read-Host.

memutarkan lagi
sumber
3
Ditto - Mungkin menambahkan teks perintah yang diambil dari bawah .. Read-Host -Prompt "Tekan Enter untuk melanjutkan"
Jon H
21

Solusi seperti cmd /c pausemenyebabkan penerjemah perintah baru untuk memulai dan berjalan di latar belakang. Meskipun dapat diterima dalam beberapa kasus, ini tidak terlalu ideal.

Solusi yang digunakan Read-Hostmemaksa pengguna untuk menekan Enterdan sebenarnya bukan "tombol apa pun".

Solusi ini akan memberi Anda antarmuka "tekan sembarang tombol untuk melanjutkan" dan tidak akan memulai penerjemah baru, yang pada dasarnya akan meniru pauseperintah asli .

Write-Host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
Ro Yo Mi
sumber
Secara teknis ISE berada di luar jangkauan karena pertanyaan awal hanya menanyakan tentang Powershell 2.0 dan mengecualikan ISE. Jika Anda menggunakan ISE, gunakan saja breakpoint.
Ro Yo Mi
4
1. Saya tidak setuju ISE berada di luar jangkauan, tapi itu tidak relevan sekarang. 2. Saya mencatat bahwa tidak ada gunanya di ISE untuk membantu orang yang lewat tentang pertanyaan ini.
Bill_Stewart
2

Selain jawaban Michael Sorens :

<6> ReadKey dalam proses baru

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • Keuntungan: Menerima tombol apa saja tetapi dengan tepat mengecualikan tombol pengubah Shift, Alt, Ctrl.
  • Keuntungan: Bekerja di PS-ISE.
besi
sumber
Ini berfungsi dengan baik, tetapi memunculkan jendela baru PowerShell, kecuali -NoNewWindowtelah ditambahkan :)
jeuxjeux20
@ jeuxjeux20, terima kasih atas sarannya, saya telah menambahkan ini ke perintah dalam jawaban.
iRon