PowerShellでもコマンドプロンプトのPauseのように一時停止する5つの方法

2024/07/09に公開

概要

コマンドプロンプトで何かバッチファイルを作成していた際、目的に対して解決できる方法に種類がなかったり、
環境依存によって特定のコマンドしか動かなかったりなどの悩みがありましたが、PowerShellスクリプトの作成では違う方向性の悩みがあります。

.NET Frameworkを使用できることにより できることが多い という悩み。

PowerShellスクリプトで一時停止する方法も、こちらの記事を参考にすると5つも方法がありました。

それぞれの方法で検証した結果をわかりやすく表形式でまとめました。

この記事のターゲット

  • PowerShellユーザーの方
  • PowerShellでコマンドプロンプトのPuaseのような一時停止をしたいと考えている方

早見表

コマンド 発行元 解説 使用例
Pause コマンドプロンプト PowerShellでもコマンドプロンプトのコマンドが使用できる。
ただ、PowerShellスクリプトのコード内で、一部だけコマンドプロンプトのコマンドをコーディングすると統一されておらずソースコードの可読性が悪くなる事や、今後のWindows OSによって使用できなくなるケースも考えられる。

この方法を採用した場合の問題点は、Windows PowerShell ISEで pause > $nullcmd /c pause > $null を実行するとエラーになってしまう点。
pause
上記のようにそのまま実行すると “続行するには何かキーを押してください . . .” と表示される。
この表示を消す場合は、pause > $null など標準出力を無視する方法で対応可能。

参考情報:標準出力を無視する方法を紹介
Read-Host PowerShell
(コマンドレット)
Read-Hostは、コンソールからテキスト入力する為のコマンドだが、一時停止としても使用可能。
PowerShellスクリプトのコード内をPowerShellで統一できる為、個人的にはこれを採用したい。

この方法を採用した場合の問題点は、Read-Hostが文字の入力を受け付けるコマンドレットのため、Enterキー以外を押した際に続行されず文字が入力・表示されてしまう点。
1行目:Write-Host '一時停止中。Enterキーで続行してください。'
2行目:Read-Host > $null

1行目でコンソール上にメッセージを表示。2行目はRead-Hostで一時停止。標準出力は、$nullにリダイレクトすることで無視する。
[Console]::ReadKey() .NET Framework キーボードの入力情報を取得するメソッド。コマンドプロンプトのPauseコマンド同様、いずれかのキーを押すと次に進む。

この方法を採用した場合の問題点は、Enterキー・Backspaceキー以外の文字入力するキーを入力した場合、コンソール上にその文字が入力・表示された状態で続行される点。
また、Windows PowerShell ISEで実行するとエラーになる点がある。
1行目:Write-Host '一時停止中。いずれかのキーを押し続行してください。'
2行目:[Console]::ReadKey() > $null

処理内容はRead-Hostコマンドレットの使用例と同様。
$host.UI.RawUI.ReadKey() PowerShell
(ホストオブジェクト)
[Console]::ReadKey()と同じ機能を呼び出しているため、同じ動作となり、問題点も同様となる。 1行目:Write-Host '一時停止中。いずれかのキーを押し続行してください。'
2行目:$host.UI.RawUI.ReadKey() > $null

処理内容はRead-Hostコマンドレットの使用例と同様。
[System.Windows.Forms.MessageBox]::Show() .NET Framework GUIのメッセージボックスが表示され、OKボタンをクリックすると続行する動き。

問題点とまではいかないものの、PowerShellは基本的にCUIベースで実行される為、一時停止の時にだけGUIのメッセージボックスを表示する方法は個人的に違和感がある。
GUIベースで作成している場合、PowerShellではなくC#で開発した方が良いとも感じる。
[System.Windows.Forms.MessageBox]::Show("一時停止中`r`nOKボタンを押し再開してください。")

メッセージ内を`r`nで改行している。

参考情報

まとめ

下記の5点を紹介。

  • コマンドプロンプトのコマンド「Pause」
  • PowerShellコマンドレット「Read-Host」
  • .Net Framework「[Console]::ReadKey()」
  • PowerShellホストオブジェクト「$host.UI.RawUI.ReadKey()」
  • .Net Framework「[System.Windows.Forms.MessageBox]::Show()」

個人的にはPowerShellコマンドレットであり、Enterキーでのみ続行する事ができるRead-Hostを今後、採用していきたいと感じました。

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960
https://zenn.dev/haretokidoki/articles/fb6830f9155de5

GitHubで編集を提案

Discussion