PowerShell 2.0で「一時停止」するにはどうすればよいですか?


113

失ってしまった。PowerShellは私を困らせます。一時停止ダイアログを表示したいのですが、表示されません。

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でも同じ問題が発生しました。ただし、標準のPowerShellコンソールでは問題なく動作します。
Charles Anderson、

3
私はpowershellをいじっていますが、それでも2年半後も、地獄のように迷惑です!
ビルK

AdamのTechリンクまたは@Michael Sorensの回答のコードを読んだ場合(2020年にこれを書いている時点で、ページの半分ほど下にあります)、一時停止をでラップする手法が見つかるかもしれませんif (!$psise) { <# pause #> }。あなたが私のようで、一時停止が必要な理由の99%が、点滅する前に画面を読むことができるようにする場合、これは役立ちます。ISEの場合、点滅しないので、一時停止は必要あり
ません

回答:


88
cmd /c pause | out-null

(PowerShellの方法ではありませんが、はるかにエレガントです。)

木を保存し​​ます。ワンライナーを使用してください。


7
/ c文字列で指定されたコマンドを実行して終了します| out-nullは出力をout-nullにパイプしますが、出力は表示されません。また、これはPowerShell ISEでは機能しないようです。プロセスは単純に行き詰まり、キーを押すことができません。それを回避する方法はありますか?
Wouter

1
@Wouterこのブログ投稿を参照してください:PowerShellスクリプトを適切に一時停止する方法
Nick

7
@Nickはい、「cmd / c pause | out-null」を置き換える47行のコードは、PowerShellの方法のように聞こえます。
ビルK

@BillK私がリンクした投稿はWouterの質問に答えます。同意しませんか?
Nick

6
それはあなたの答えについての解説ではありませんでした、私はあなたが全く正しいと思います。PowerShellの解説です。私は適度にうんざりしています-Cobolでプログラムして以来、これほど無意味なあいまいな冗長性を見たことはありません。
ビルK

234

明確にするために、ここでの選択を要約/要約することは価値があると思います...そして、最高のユーティリティを提供すると私が信じる新しいバリエーションを提供します。

<1> ReadKey(System.Console)

write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
  • 利点:任意のキーを受け入れますが、Shift、Alt、Ctrl修飾キーを適切に除外します。
  • 欠点:PS-ISEでは機能しません。

<2> ReadKey(RawUI)

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  • 欠点:PS-ISEでは機能しません。
  • 欠点:修飾キーを除外しません。

<3> cmd

cmd /c Pause | Out-Null
  • 欠点:PS-ISEでは機能しません。
  • 短所:最初の使用時に新しいシェル/ウィンドウを目に見える形で起動します。以降の使用では目立たないが、それでもオーバーヘッドがある

<4>読み取りホスト

Read-Host -Prompt "Press Enter to continue"
  • 利点:PS-ISEで動作します。
  • 欠点:Enterキーのみを受け入れます。

<5> ReadKeyコンポジット

これは、上記の<1>と、AdamのTech Blog(このページの以前のコメントのNickの好意による)提案から抽出されたISEの回避策/ kludgeを組み合わせたものです。私は後者に2 つのわずかな改善を加えました。Set-StrictModeを使用する場合のエラーを回避するためにTest-Pathを追加しました(そうですよね!)と、キーストローク後に改行を追加して適切な場所にプロンプ​​トを表示します。

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
    }
}
  • 利点:任意のキーを受け入れますが、Shift、Alt、Ctrl修飾キーを適切に除外します。
  • 利点:PS-ISEで動作します(ただし、Enterまたはマウスクリックでのみ)
  • 欠点:ワンライナーではありません!

9
ベストアンサー、特にあらゆる場所で機能するソリューションを提供するため
Petr

正解です。AllowCtrlC選択肢2にパラメーターを追加すると、ユーザーはスクリプトを終了せずにCtrl + Cをクリックできるようになります。それでも、この選択では依然としてCtrl修飾キーが適切に除外されません。(ユーザーがCtrlキーのみをクリックするかのように機能します)参照:Microsoft TechNet-Windows PowerShellヒント:続行するには任意のキーを押してください
Oz Edri

2
オプション3と5には別の欠点があります:Linuxでは機能しません
bitbonk

43

コンソールから入力を読みたいと思います。その場合は、を使用してくださいRead-Host


3
同上-たぶん、下から略したプロンプトテキストを追加します。Read-Host -Prompt "Press Enter to continue"
Jon H

21

などの解決策はcmd /c pause、新しいコマンドインタープリターを開始してバックグラウンドで実行させるものです。場合によっては許容できますが、これは実際には理想的ではありません。

使用するソリューションRead-Hostは、ユーザーに強制的に押すことEnterであり、実際には「任意のキー」ではありません。

このソリューションは、真の「任意のキーを押して続行する」インターフェースを提供し、基本的に元のpauseコマンドを模倣する新しいインタープリターを開始しません。

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

元の質問はPowershell 2.0についてのみ尋ね、ISEを除外したため、技術的にはISEは対象外です。ISEを使用している場合は、ブレークポイントを使用します。
Ro Yo Mi

4
1. ISEが範囲外だったことに同意しませんが、それは今は関係ありません。2.この質問について通行人を支援することはISEでは機能しないことに注意しました。
Bill_Stewart 2017

2

Michael Sorensの回答に加えて:

<6>新しいプロセスのReadKey

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • 利点:任意のキーを受け入れますが、Shift、Alt、Ctrl修飾キーを適切に除外します。
  • 利点:PS-ISEで動作します。

これはうまく機能しますが、-NoNewWindow追加されていない限り、Powershellの新しいウィンドウがポップアップ表示されます:)
jeuxjeux20

@ jeuxjeux20、提案をありがとう、私はこれを回答のコマンドに追加しました。
iRon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.