Windowsバッチファイル(.bat)でメッセージを表示する場合は、通常「echo」コマンドでプロンプト内に標準出力させるので、メッセージボックスは使えません。
しかし、メッセージボックスの方がユーザーには伝わりやすい…かも。
調べてみると、バッチファイルで無理やりメッセージボックスを表示させる方法がありました。
なお、今回作業したバージョンは以下の通りです。
- Windows 10 Pro(64bit)
VBScriptと組み合わせてメッセージボックスを表示する
無理やりメッセージボックスを表示する方法は、Microsoftのスクリプト言語である「VBScript」(.vbs)と組み合わせて行います。
VBScriptは、Windows上で標準で動作します。
なので、ソースコードのファイル拡張子を「.vbs」にしてダブルクリックすれば簡単に実行できます。
メッセージボックスを表示するには、VBScriptのMsgBox関数を使用します。
関数の詳細はMicrosoftリファレンスでご確認いただけます。
メッセージボックスを表示するバッチファイル
実際に、メッセージボックスを表示するバッチファイルを作成してみました。
内容は、echoコマンドでVBScriptのメッセージボックスを表示するコードを一時ファイルとして出力し、それを実行するというものです。
@echo off
rem メッセージ表示
echo MsgBox "メッセージを表示します。",vbInformation,"情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs
rem ファイル削除
del /Q %TEMP%\msgbox.vbs
pause
これを実行すると、このようにメッセージボックスが表示されます。
そして、TEMPフォルダ(C:\Users\[ユーザー名]\AppData\Local\Temp)にVBScriptファイルが作成されていました。
確かに、エラーや情報などの表示させるだけのメッセージならこちらの方が伝わりやすいかも…。
念のため、次の行で作成したファイルは削除しています。
メッセージボックスの戻り値を取得する
さらに無理やりで、OK/キャンセルボタンのメッセージボックスを使用して、押したボタンを戻り値として取得してみます。
戻り値として取得できるのは、直前に実行したコマンドのエラーコードが格納されている環境変数「ERRORLEVEL」の整数のみですので、これに押したボタンの値を設定します。
OK/キャンセルボタンの値は、以下の通りです。
- [OK] … 1(vbOK)
- [キャンセル] … 2(vbCancel)
バッチファイルは、以下のようになりました。
@echo off
rem メッセージ表示
echo Dim answer:answer = MsgBox("よろしいですか?",vbOKCancel,"確認"):WScript.Quit(answer) > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs
echo %ERRORLEVEL%
rem ファイル削除
del /Q %TEMP%\msgbox.vbs
pause
上記コードのポイントは以下です。
- ~:~ … コロンで複数行を1行に連結する。
- WScript.Quit(0) … 指定されたエラーコードで実行を終了する。
VBScriptでコロン(:)を使用し、1行に連結して3行分書いています。
「WScript.Quit」で、終了時のエラーコードにOK/キャンセルボタンで押したボタンの値を設定しています。
これを実行すると、押したボタンによって「1」か「2」が表示されますので、後はif文で条件分岐などを行えばいいかと思います。
ほんとに無理やり。。
1行で書くなら以下のようにします。
こちらの方がスマートですね。
@echo off
rem メッセージ表示
echo WScript.Quit(MsgBox("よろしいですか?",vbOKCancel,"確認")) > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs
echo %ERRORLEVEL%
rem ファイル削除
del /Q %TEMP%\msgbox.vbs
pause
最後に
今回は、Windowsバッチファイル(.bat)で、メッセージボックスを表示する方法を紹介しました。
無理やりな方法ですが、ユーザーには分かりやすいかも…。
コメント
参考にさせていただいています。
msgBOXの文字列を改行することは可能でしょうか?
コメントありがとうございます。
改行するには、改行の定数vbCrLfを使用すれば可能です。
以下のように、エスケープしたアンパサンドでvbCrLfを繋げれば改行されて出力されると思います。
echo MsgBox "メッセージを表示します。" ^&vbCrLf^& "メッセージを表示します。", vbInformation, "情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs