適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

PowerShellでMessageBoxを使う3つの方法

シェルは基本的に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

f:id:shinmai_papa:20200719000620p:plain

戻り値は一見、文字列ですが、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)

f:id:shinmai_papa:20200719000617p:plain

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

f:id:shinmai_papa:20200719000623p:plain

終わりに

PowerShellでMessageBoxを出す方法の紹介でした。

一口にMessageBoxを出すといっても色々なコンポーネントを利用できるPowerShellになると様々な方法がありますね。

用途に応じて使い分けてみてください。

ここまでお読みいただき、ありがとうございました。

関連記事

www.tekizai.net