ネプラスのテックブログ。ネットワーク、クラウド、サーバなどのITインフラ情報を中心に発信中。

  1. ネプラス インフラエンジニア採用
  2. テックマガジン
  3. エンジニア
  4. PowerShellでPauseを実現するには?Pauseの代用方法も紹介!

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

  • エンジニア
  • テクノロジー
公開日時:   更新日時:
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%現給与保証

      前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。

      ※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。

    • インセンティブ制度

      インセンティブ制度

      ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。

      取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。

    • 社会保険・福利厚生

      社会保険・福利厚生

      社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。

      さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。

    • 東証プライム上場企業グループ

      東証プライム上場企業グループ

      ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。

      安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。

    ネプラス株式会社に興味を持った方へ

    ネプラス株式会社では、インフラエンジニアを募集しています。

    年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
    オンライン面接も随時受付中。ぜひお気軽にご応募ください。

    ネプラス株式会社へのご応募はこちら↓
    ネプラス株式会社へのご応募はこちら↓

    新着案件New Job

    CCNA取得者歓迎!案件・求人はこちら