シェルは基本的にCGIですが、ユーザーにわかりやすいインターフェースを提供したいときはMessageBoxが便利です。
そこで今回は、PowerShellでMessageBoxを使う方法を3つ紹介したいと思います。
.NETを使う
基本はこれが一番いいと思います。
一番取り回しがしやすく、
変数も列挙型で指定できるのでコーディングも楽です。
定義
.NETのSystem.Windows.Formsをロードする必要があります。
PS C:\> add-type -AssemblyName System.Windows.Forms
MessageBoxを表示するためには、Showメソッドを使います。
Showメソッドは、なんと、オーバーロードが21個もあります。
PS C:> ([System.Windows.Forms.MessageBox]::Show).OverloadDefinitions.count 21
多すぎ!!
色々なパターンがオーバーロードされて用意されているのはありがたいですが・・・。
ここではとても全部は触れられないので、詳細は公式リファレンスをご参照ください
→MessageBox クラス (System.Windows.Forms) | Microsoft Docs
やってみる
21個のオーバーロードがあると言っても、使うのはその一部です。
百聞は一見に如かず。
やってみます。
Yes,Noボタンを出すメッセージボックスです。
PS C:> [System.Windows.Forms.MessageBox]::Show("コンテキスト","キャプション",[System.Windows.Forms.MessageBoxButtons]::YesNo) Yes
戻り値は一見、文字列ですが、System.Windows.Forms.DialogResult型のオブジェクトが返ってきています。
PS C:> [System.Windows.Forms.MessageBox]::Show("コンテキスト","キャプション",[System.Windows.Forms.MessageBoxButtons]::YesNo)|Get-Member TypeName: System.Windows.Forms.DialogResult
ボタンの種類や、既定のボタン(最初に選択されているボタン)、アイコンなどは列挙型が定義されており、用途に応じて々カスタマイズすることができます。
またもやここでは紹介しきれないので、詳しくは、公式リファレンスをご参照ください。
→ MessageBoxButtons 列挙型 (System.Windows.Forms) | Microsoft Docs
Wscript
こちらも比較的簡単に使えます。
また、機能的にも面白い機能を備えています。
定義
PS C:> $shell=New-Object -ComObject wscript.shell PS C:> $shell.Popup OverloadDefinitions ------------------- int Popup (string, Variant, Variant, Variant)
引数は、表示するメッセージ、制限時間、タイトル、タイプの4種類です。
他と際立って異なるのは、MessageBoxを出している時間を指定できるところです。
やってみる
10秒間、MessageBoxを出す。
PS C:\Users\USER> $shell.Popup("コンテキスト",10,"キャプチャ",1)
10秒経つと、MessageBoxは消滅し、戻り値-1が返ってきます。
戻り値の一覧
値 | 定数 | 意味 |
---|---|---|
1 | vbOK | [OK]が押された |
2 | vbCancel | [キャンセル]が押された |
3 | vbAbort | [中止]が押された |
4 | vbRetry | [再試行]が押された |
5 | vbIgnore | [無視]が押された |
6 | vbYes | [はい]が押された |
7 | vbNo | [いいえ]が押された |
-1 | なし | 制限時間が経過した |
ボタンの一覧
値 | 定数 | 意味 |
---|---|---|
0 | vbOKOnly | [OK]のみ表示する |
1 | vbOKCancel | [OK][キャンセル]を表示する |
2 | vbAbortRetryIgnore | [中止]「再試行]「無視]を表示する |
3 | vbYesNoCancel | [はい][いいえ][キャンセル]を表示する |
4 | vbYesNo | [はい][いいえ]を表示する |
5 | vbRetryCancel | [再試行][キャンセル]を表示する |
アイコンの種類
値 | 定数 | 意味 |
---|---|---|
0 | なし | アイコンを表示しない |
16 | vbCritical | 「STOP」アイコンを表示する |
32 | vbQuestion | 「?」アイコンを表示する |
48 | vbExclamation | 「!」アイコンを表示する |
64 | vbInformation | 「i」アイコンを表示する |
デフォルトで選択されているボタン
値 | 定数 | 意味 |
---|---|---|
0 | vbDefaultButton1 | 1番目のボタンを選択 |
256 | vbDefaultButton2 | 2番目のボタンを選択 |
512 | vbDefaultButton3 | 3番目のボタンを選択 |
Win32 API
一番面倒。でもWindowsのネイティブなAPIということもあって勉強にはなります。
というか、.NETもWscriptも内部ではこれを使っているため、これがわかれば全てわかります。
定義
PS C:\> $src=@" >>using System; >>using System.Runtime.InteropServices; >> >> >>public static class Win32{ >>[DllImport("user32.dll")] >>public static extern int MessageBox(int hWnd,string msg,string caption,int uType); >>} >> "@ PS C:\> Add-Type -TypeDefinition $src
第1引数は、親ウィンドウのハンドルです。親はいないのでnullを渡します。
第2引数はMessageBox内の文字列を、第3引数はタイトル、第4引数はボタンの数やアイコンなどをビットで指定することができます。
第4引数は、実は、先ほどのWsciptの一覧にある値を論理和してあげます。
戻り値は、先ほどのWsciptと同じです。
やってみる
パターンが多いので、ここでは簡単な例を一つだけ・・・。
PS C:\> [Win32]::MessageBox($null,"コンテキスト","キャプション",0) 1
終わりに
PowerShellでMessageBoxを出す方法の紹介でした。
一口にMessageBoxを出すといっても色々なコンポーネントを利用できるPowerShellになると様々な方法がありますね。
用途に応じて使い分けてみてください。
ここまでお読みいただき、ありがとうございました。