PowerShell 2.0 ile nasıl bir 'Duraklatma' yaparsınız?


114

Tamam, kaybediyorum. PowerShell beni sinirlendiriyor. Bir duraklama iletişim kutusunun görünmesini istiyorum ve olmayacak.

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
PowerShell ISE'de de aynı sorunu yaşadım. Yine de standart PowerShell konsolunda iyi çalışıyor.
Charles Anderson

3
Sadece powershell ile uğraşıyorum ve bu hala 2 1/2 yıl sonra bile cehennem kadar sinir bozucu!
Bill K

Eğer okursanız Adem'in Tech bağlantısını veya kod @Michael Sorens cevap (Ben 2020 yılında bu yaz yaklaşık sayfanın ortasındaki) daki duraklama sarma tekniğini keşfedebilir if (!$psise) { <# pause #> }. Siz de benim gibiyseniz ve duraklama nedeninizin% 99'u, ekranı yanıp sönmeden önce okuyabilmenizdir, o zaman bu yardımcı olacaktır, çünkü İMKB'deyseniz, göz kırpmaz ve Duraklamaya ihtiyacım yok
john v kumpf

Yanıtlar:


89
cmd /c pause | out-null

(Bu PowerShell yöntemi değil, ama çok daha zarif.)

Ağaçları koru. Tek gömlekler kullanın.


7
/ c Dizge tarafından belirtilen komutu çalıştırır ve sonra | out-null, çıktıyı hiç göremeyeceğiniz yerde out-null'a aktarır. "Devam etmek için herhangi bir tuşa basın ..." mesajını görmek istiyorsanız, boruyu kaldırın. Ayrıca, bu PowerShell ISE'de çalışmıyor gibi görünüyor. İşlem basitçe takılıp kalıyor ve herhangi bir tuşa basamazsınız. Bunun etrafında herhangi bir yolu var mı?
Wouter

1
Nick

7
@Nick evet, PowerShell yöntemine benzeyen "cmd / c pause | out-null" yerine 47 satırlık kod.
Bill K

@BillK Wouter'ın sorusuna yanıt verdiğim gönderi. Katılmıyor musun
Nick

6
Cevabınıza yorum yapılmadı, bence tamamen haklısınız. PowerShell ile ilgili bir yorum. Orta derecede tiksiniyorum - Cobol'da programladığımdan beri bu kadar anlamsız, belirsiz ayrıntılar görmedim.
Bill K

234

Açıklık için buradaki seçimleri özetlemenin / özetlemenin faydalı olacağını düşünüyorum ... daha sonra en iyi faydayı sağladığına inandığım yeni bir varyasyon sunun.

<1> ReadKey (System.Console)

write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
  • Avantaj: Herhangi bir tuşu kabul eder, ancak Shift, Alt, Ctrl değiştirici tuşlarını uygun şekilde hariç tutar.
  • Dezavantaj: PS-ISE'de çalışmaz.

<2> ReadKey (RawUI)

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  • Dezavantaj: PS-ISE'de çalışmaz.
  • Dezavantaj: Değiştirici tuşları hariç tutmaz.

<3> cmd

cmd /c Pause | Out-Null
  • Dezavantaj: PS-ISE'de çalışmaz.
  • Dezavantaj: İlk kullanımda gözle görülür şekilde yeni bir kabuk / pencere açar; sonraki kullanımda fark edilmez, ancak yine de ek yükü vardır

<4> Okuma-Barındırma

Read-Host -Prompt "Press Enter to continue"
  • Avantaj: PS-ISE'de çalışır.
  • Dezavantaj: Yalnızca Enter tuşunu kabul eder.

<5> ReadKey bileşiği

Bu, Adam's Tech Blogundaki tekliften çıkarılan ISE geçici çözümü / kludge ile yukarıdaki <1> bileşiminin bir bileşimidir ( bu sayfadaki önceki yorumlardan Nick'in izniyle). İkincisi için iki küçük iyileştirme yaptım: Set-StrictMode ( kullanıyorsun , değil mi ?!) kullanıyorsanız bir hatayı önlemek için Test-Yolu ve tuş vuruşunuzdan sonra yeni satır eklemek için son Yazma Ana Bilgisayarı eklendi. doğru yerde istemi.

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
    }
}
  • Avantaj: Herhangi bir tuşu kabul eder, ancak Shift, Alt, Ctrl değiştirici tuşlarını uygun şekilde hariç tutar.
  • Avantaj: PS-ISE'de çalışır (yalnızca Enter veya fare tıklamasıyla olsa da)
  • Dezavantaj: Tek astar değil!

9
En iyi yanıt, özellikle her yerde işe
Petr

Mükemmel cevap! AllowCtrlC2. seçeneğe parametre eklemenin , kullanıcının komut dosyasını sonlandırmadan Ctrl + C tuşlarına basmasına izin verdiğini not etmek isterim . Yine de, bu seçim Ctrl değiştirici tuşunu düzgün şekilde hariç tutmuyor. (kullanıcı yalnızca Ctrl tuşunu tıklarmış gibi davranır) Referans: Microsoft TechNet - Windows PowerShell İpucu: Devam
Etmek İçin

2
Seçenek 3 ve 5'in başka bir dezavantajı daha var: linux üzerinde çalışmıyor
bitbonk

43

Konsoldan girişi okumak istediğinizi varsayıyorum. Eğer öyleyse, kullanın Read-Host.


3
Ditto - Belki aşağıdan çalınan bilgi istemi metnini ekleyin .. Read-Host -Prompt "Devam etmek için Enter'a basın"
Jon H

21

Bu gibi çözümler cmd /c pause, yeni bir komut yorumlayıcısının arka planda başlamasına ve çalışmasına neden olur. Bazı durumlarda kabul edilebilir olsa da, bu gerçekten ideal değildir.

Kullanan çözümler Read-Host, kullanıcıyı basmaya zorlar Enterve gerçekten "herhangi bir anahtar" değildir.

Bu çözüm size gerçek bir "devam etmek için herhangi bir tuşa basın" arayüzü verecek ve orijinal pausekomutu taklit edecek yeni bir yorumlayıcı başlatmayacaktır .

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

Teknik olarak İMKB kapsam dışındadır çünkü orijinal soru sadece Powershell 2.0 hakkında sorulmuştur ve İMKB'yi kapsam dışı bırakmıştır. ISE kullanıyorsanız, sadece bir kesme noktası kullanın.
Ro Yo Mi

4
1. İMKB'nin kapsam dışı olduğuna katılmıyorum, ancak bu artık anlamsız. 2. Bu soruda yoldan geçenlere yardımcı olmanın İMKB'de işe yaramadığını belirtmiştim.
Bill_Stewart

2

Michael Sorens'in cevabına ek olarak :

<6> ReadKey yeni bir süreçte

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • Avantaj: Herhangi bir tuşu kabul eder, ancak Shift, Alt, Ctrl değiştirici tuşlarını uygun şekilde hariç tutar.
  • Avantaj: PS-ISE'de çalışır.

Bu harika çalışıyor, ancak -NoNewWindoweklenmemişse yeni bir powershell penceresi
açılıyor

@ jeuxjeux20, öneri için teşekkürler, bunu cevaba komuta ekledim.
iRon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.