PowerShellでメッセージボックスを使う4つの方法 - 適材適所

適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

PowerShellでメッセージボックスを使う4つの方法

メッセージボックス。

ユーザーにお知らせを書くことができるWindowです。

そんな便利なメッセージボックスをPowerShellでも使いたいですね。

一般的にシェルはコマンドラインのインターフェースなのでそんな見た目に鮮やかなものは使えません。

PoewrShellもそんなコマンド指向の文字指向の一般的なシェルの仲間でしょうか。

いえ、違います。

PowerShellはそんな枠には収まらないすごいやつなのです。

今回は、そんなPowerShellでメッセージボックスを使う方法を4つも!!!紹介したいと思います。

.NET

.NETの機能でメッセージボックスを使う方法です。

下準備として、.NETのSystem.Windows.Formsをロードします。

 
Add-Type -AssemblyName System.Windows.Forms

Yes,Noボタンを設置したメッセージボックスを表示してみます。

 
[System.Windows.Forms.MessageBox]::Show("コンテキスト","キャプション",[System.Windows.Forms.MessageBoxButtons]::YesNo)

f:id:shinmai_papa:20200719000620p:plain

実行結果(Yesをクリック)

Yes

上記のように、メッセージボックスを表示するには、Showメソッドを使います。

ちなみにShowメソッドには、なんと21個ものオーバーロードがあります。

 
([System.Windows.Forms.MessageBox]::Show).OverloadDefinitions.count

処理結果

21

多すぎィィ!!

色々なパターンがオーバーロードされて用意されているのはありがたいですが・・・。

ここではとても全部は触れられないので、詳細は公式リファレンスをご参照ください。

MessageBox クラス (System.Windows.Forms) | Microsoft Docs

と、話が逸れてしまいました。

先ほどの例に戻ります。

先ほどの例だと、戻り値はYesとなっており、一見、文字列に見えますが実は違います。

System.Windows.Forms.DialogResult型なるオブジェクトです。

 
[System.Windows.Forms.MessageBox]::Show("コンテキスト","キャプション",[System.Windows.Forms.MessageBoxButtons]::YesNo)|Get-Member

実行結果

TypeName: System.Windows.Forms.DialogResult
(以下略)

他にも、ボタンの種類や、既定のボタン(最初に選択されているボタン)、アイコンなどは列挙型が定義されており、用途に応じて々カスタマイズすることができます。

やはり、ここでは紹介しきれないので、詳しくは公式リファレンスをご参照ください。

MessageBoxButtons 列挙型 (System.Windows.Forms) | Microsoft Docs

Wscript

Wscriptを使ったメッセージボックスの例です。

こちらも比較的簡単に使えます。

また、機能的にも面白い機能を備えています。

 
$shell=New-Object -ComObject wscript.shell
$shell.Popup("コンテキスト",0,"キャプチャ",1)

実行結果(Yesをクリック)

1

f:id:shinmai_papa:20200719000617p:plain

定義を確認してみると、

$shell.Popup

OverloadDefinitions
-------------------
int Popup (string, Variant, Variant, Variant)

引数に4つ指定できることがわかります。

表示するメッセージ、制限時間、タイトル、タイプの4種類です。

制限時間という引数としては聞きなれないものがあります。

これはメッセージボックスを表示する時間の指定です。

10秒間、メッセージボックスを出すときはこんな感じ。

 
$shell.Popup("コンテキスト",10,"キャプチャ",1)

10秒経過後

-1

10秒経つとメッセージボックスが消え、時間経過で消滅したことを示す戻り値の-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番目のボタンを選択

Visual Basic

Visual Basicを使っちゃう。

 
Add-Type -AssemblyName Microsoft.VisualBasic
[Microsoft.VisualBasic.Interaction]::MsgBox("メッセージ!!")

f:id:shinmai_papa:20210426221248p:plain

ちなみに定義は1つだけ。

 
[Microsoft.VisualBasic.Interaction]::MsgBox

処理結果

OverloadDefinitions
-------------------
static Microsoft.VisualBasic.MsgBoxResult MsgBox(System.Object Prompt, Microsoft.VisualBasic.MsgBoxStyle Buttons, System.Object Title)

ボタンの指定はMsgBoxStyleにあるので、これを使うと便利です。

[Microsoft.VisualBasic.MsgBoxStyle]::YesNo

Win32 API

WindowsのAPIを使った方法です。一番面倒です。

でもWindowsのネイティブなAPIということもあって勉強になります。

というか、.NETもWscriptも内部ではこれを使っているため、これがわかれば全てわかります。

 
$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);
}
'@
Add-Type -TypeDefinition $src
[Win32]::MessageBox($null,"コンテキスト","キャプション",0)

処理結果(Yesをクリック)

1

f:id:shinmai_papa:20200719000623p:plain

第1引数は、親ウィンドウのハンドルです。

親はいないのでnullを渡します。

第2引数はMessageBox内の文字列を、第3引数はタイトル、第4引数はボタンの数やアイコンなどをビットで指定することができます。

第4引数は、実は先ほどのWsciptの一覧にある値を論理和してあげます。

戻り値は、先ほどのWsciptと同じです。

細かい設定ができて柔軟に使えますが、逆に細かすぎて普段使いにはちょっと向かない感じかも・・・。

終わりに

PowerShellでメッセージボックスを扱う方法を紹介してみました。

一口にメッセージボックスと言っても様々な方法がありました。

これも様々なインターフェースを準備してくれているPowerShellの強みですね!

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

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