PowerShellでPauseを実現するには?Pauseの代用方法も紹介!

PowerShellのPauseとは?
PowerShellはWindows10に最初からインストールされているシェル機能です。Windowsには以前からDOS窓と言われるコマンドプロンプトが入っていますが、PowerShellはそれを大幅に機能強化したものと言えるでしょう。
Pauseはコマンドプロンプトで使用できる、Enterキーの入力があるまで処理を一時停止する機能です。スクリプトで処理を行って結果を表示した後、ウィンドウをすぐ閉じないようにするために必要な機能ですが、それをPowerShellで実現する方法を解説します。
PowerShellでもPauseは使える
コマンドプロンプトのPauseをPowerShellで実現するにはどうしたらよいのでしょうか。実は、PowerShellでもPauseを使えます。PowerShellのコマンドラインで、
Pause
と入力してEnterを押すと、
続行するには、Enter キーを押してください…:
と表示され、Enterキーの入力待ちになります。なぜコマンドプロンプトのコマンドがPowerShellで使えるのでしょうか。それはPauseを実行すると、内部で以下を実行してくれるからです。
cmd Pause
Pauseのメッセージを変更するには?
cmdはPowerShellでコマンドプロンプトのコマンドを実行する機能で、それによりPowerShellでPauseを実行してくれるということです。ただし、Enterキーの入力を促すメッセージを変えたい場合は、コマンドプロンプトと同じようにはいきません。
Write-Host Enterキーを押してくださーい!
Pause > NUL
自分で別のメッセージを表示して、Pauseのメッセージをなくしたいのですが、これではエラーになってしまいます。コマンドプロンプトでは「コマンド > NUL」で出力をなくせますが、PowerShellではそれではできません。
Out-Nullで出力を消すことが出来る
PowerShellでは「コマンド | Out-Null」で出力なしにできます。では以下のようにすればうまくいくのでしょうか。
Pause | Out-Null
しかしこれでも表示が出てしまいます。正解は、以下のようにすればメッセージをなくすことができます。/cは指定されたコマンドを実行後、終了するという意味です。
cmd /c Pause | Out-Null
ただし、ここまでの話は「Windows PowerShell」のコマンドラインで入力した場合に限ります。
PowerShellとしてのPauseを自作するべき
cmd Pauseは「Windows PowerShell ISE」で入力したり、ps1ファイルに保存してスクリプトとして実行すると正しく動作しません。ただしPauseのみであればISEでも正しく動作します。結局、PowerShellではPauseはメッセージの内容を変更せずに使うしかないということになります。
そういった経緯から、動作のカスタマイズをしづらいコマンドプロンプトのPauseを使うのではなく、PowerShellの機能でPauseを再現するのが望ましいと言えます。
Read-Hostで代用すれば解決
PowerShellのPauseは以下のようにRead-Hostを使うのがベストでしょう。メッセージを自由に表示できます。メッセージの末尾に「:」が表示されるのも同じです。
Read-Host Enterを押してね!
ただし、Read-Hostは本来、テキストを入力してもらうためのコマンドです。それをPauseの代用にするのは違和感がある人もいるでしょう。
ReadKeyによるPause
やり方の1つとして以下があります。
Write-Host 何かキーを押してください。 -NoNewLine
[Console]::ReadKey() | Out-Null
NoNewLineで改行を防ぎ、任意のキーで先に進みます。Enter以外にも対応できるメリットがあります。ただし、Windows PowerShell ISEではエラーになるという問題があります。
ReadKeyの別のやり方
別のやり方としては以下があります。
Write-Host 何かキーを押してください。
$host.UI.RawUI.ReadKey()
しかしこれも、Windows PowerShell ISEではエラーになります。そこで以下のようにすると、ISEとそれ以外で処理を分けることができます。ただPause処理でこのようなことをするくらいなら、Read-Hostで統一した方が良いでしょう。
if ($psISE) {
Read-Host Enterキーを押してください。
} else {
Write-Host 何かキーを押してください。
$host.UI.RawUI.ReadKey()
}
UIボタンを表示するPause的な処理
グラフィカルなユーザインターフェイスを表示したい場合は、以下のようにします。
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show(“Push OK Button.”)
実行すると、ウィンドウ付きのダイアログが表示されます。OKボタンをクリックすると先に進めます。なお、ISEでもそれ以外でも問題なく利用できます。
パスワード入力の方法は?
Pauseと少し違う話になりますが、ただEnterを待つのではなく、パスワードを入力させたい場合は以下のようにします。
$pass = Read-Host “パスワードを入力してください。” -AsSecureString
ISEの場合はパスワード用ダイアログが表示され、それ以外では入力すると****のように入力テキストが隠されて表示されます。ところが入力した内容を以下のように表示すると、
Write-Host $pass
以下のように正しく表示されません。-AsSecureStringにより暗号化されて隠蔽されるのです。
System.Security.SecureString
SecureStringの変換
そこで以下のように処理を追加しましょう。
$pass = Read-Host “パスワードを入力してください。” -AsSecureString
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
$str = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
Write-Host $str
こうすると以下のようにパスワードを表示することができます。
パスワードを入力してください。: ****
abcd
パスワードファイルを作成する
PowerShellは[dll名]::API名でWindowsのシステム機能を呼び出すことができます。SecureStringToBSTRでSecureStringをバイナリ文字列に変換し、PtrToStringBSTRでバイナリ文字列を通常の文字列に変換します。
なおパスワードを照合するにあたって、正しいパスワードをスクリプトに記述するわけにはいきません。そこでまず、以下を実行してパスワードファイルを作成します。実行するとダイアログが表示されてパスワードを入力し、passファイルが生成されます。
$cr = Get-Credential
$cr.Password | ConvertFrom-SecureString | Set-Content C:\test\password.pass
パスワードファイルの中身と照合する
後は以下でpassファイルの中身と照合ができます。passファイルの中身も変換が必要な点に注意してください。
$pass = Read-Host “パスワードを入力してください。” -AsSecureString
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
$str = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
$master_pass = Get-Content C:\test\password.pass | ConvertTo-SecureString
$m_bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($master_pass)
$m_str = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($m_bstr)
if ($str -eq $m_str) {
Write-Host パスワードが一致しました。
} else {
Write-Host パスワードが違います。
}
PowerShellのPauseは簡単に実現できる
PowerShellのPauseは簡単に実現が可能だということを解説しましたが、ご理解頂けましたでしょうか。
Read-Hostでも代用できることも解説しました。コマンドプロンプトのPauseも使えますが、なるべくPowerShellのコマンドで実現したほうが良いでしょう。
FEnetを運営しているネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。


新着案件New Job
-
【高額年収】/【CCNA取得者歓迎】/ネットワークの構築/BIG-IP/東京都千代田区/【WEB面談可】/在宅ワーク/20代~30代の方活躍中
年収540万~540万円東京都千代田区(神保町駅) -
東京都中央区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収600万~600万円東京都中央区(小伝馬町駅) -
【高額年収】/インフラ構築支援/東京都港区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収960万~960万円東京都港区(新橋駅) -
ガバナンス推進、セキュリティ基盤支援/東京都港区/【WEB面談可】/在宅ワーク/20代~40代の方活躍中
年収780万~780万円東京都港区(新橋駅) -
カー用品販売会社の情報システム運用/東京都千代田区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/テレワーク
年収576万~576万円東京都千代田区(水道橋駅) -
ネットワーク構築、検証/東京都渋谷区/【WEB面談可】/テレワーク/20代~40代の方活躍中
年収540万~540万円東京都渋谷区(渋谷駅)