PowerShell 2.0 で「一時停止」を実行するにはどうすればいいですか? 質問する

PowerShell 2.0 で「一時停止」を実行するにはどうすればいいですか? 質問する

はい、もう我慢できなくなりました。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

わかりやすくするために、ここで選択肢を要約/要約し、その後、最も有用性が高いと思われる新しいバリエーションを提案することは価値があると思います。

<1> ReadKey (System.Console)

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

<2> 読み取りキー (RawUI)

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

<3> コマンド

cmd /c Pause | Out-Null
  • 欠点: PS-ISE では動作しません。
  • デメリット: 初回使用時に新しいシェル/ウィンドウが起動します。その後の使用では目立ちませんが、それでもオーバーヘッドがあります。

<4> 読み取りホスト

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

<5> ReadKey複合

これは、上記の<1>と、提案から抽出されたISEの回避策/クルージュを組み合わせたものです。アダムの技術ブログ(このページの以前のコメントのニックさんのおかげです)。私は後者に2つの小さな改良を加えました。Test-Pathを追加して、厳密モードの設定(そうですよね?!) そして最後の Write-Host は、キーストロークの後に改行を追加して、プロンプトを適切な場所に配置します。

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 キーまたはマウス クリックのみ)
  • デメリット: ワンライナーではない!

おすすめ記事