はい、もう我慢できなくなりました。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 キーまたはマウス クリックのみ)
- デメリット: ワンライナーではない!