はじめに
「エンドユーザーのPCにバッチファイルを置き、クリックして実行してもらう」といった局面が、頻度としては少ないものの、たまにあります。
そのような時によく使われるのはWSHやHTAでしょう。特に、HTAの場合は、HTMLを使ってユーザーフレンドリーなGUIのアプリケーションを簡便に作成することができます。
しかし、ここではあえてコマンドラインのバッチにこだわって話を進めてみたいと思います。
対象読者
仕事でバッチファイルを作成したり修正したりする必要がある人。
必要な環境
Windows 2000/Windows XPが対象です(Vistaは未検証)。
なぜバッチファイルを使うのか
理由は単純で、筆者のように「バッチの方が書き慣れている人」の場合、同じ処理を書くにしても、工数を抑えることができるからです。
NT以降のDOSのバッチであれば、IF分岐やFORループが使えますし、環境変数ERRORLEVEL
を使用して、ある程度は細かいエラーハンドリングも可能です。また、バッチを書き慣れている人であれば、これまでの蓄積で、再利用可能な小物バッチがそれなりに揃っているであろう、という点も理由の一つです。
しかし、やはりそこはバッチファイルですから、お客様から「あの黒い窓はどうもなじみにくい」というご意見をいただくこともあります(色は簡単に変えられます)。
特に、
set /p 変数名=
などを使った「値の入力」などについては、見た目上、どうしても貧弱になってしまいます。
また「ファイル選択」についても、プロンプトに直接ファイルをドラッグ&ドロップし、上記と同様の方法でフルパスを取得できますが、これなどもエンドユーザーにとっては、見慣れた[ファイルを選択]ダイアログの方がいい、と思われる部分のようです。
GUIのダイアログを使ったバッチができないか
さて、ここからが本題です。
せっかく作ったバッチのすべての内容をWSHやHTAに書き換えることなく、エンドユーザーが入力・選択する部分のインターフェイスのみ、OS標準の見慣れたダイアログにできないものでしょうか。
ここで紹介する方法は、実際に筆者がエンドユーザー向けの対話型バッチとして作成したものを基にしています。
使用するのは短いVBScriptと短いCで書いたコマンドラインのアプリ。コアな部分はバッチファイル内でまかなうという前提で、VBScriptとCのアプリはあくまでも補助的な意味合いです。
バッチのシナリオ
シナリオは次のようなものであるとします。
- エンドユーザーがバッチファイルのショートカットをダブルクリック
- メッセージボックスを表示して処理を行うか確認
- インプットボックスを表示して必要事項を入力
- 処理対象となるファイルをコモンダイアログで選択
- 結果の出力先となるディレクトリをコモンダイアログで選択
- 必要な情報は揃ったはずなので、以下、XXX処理を行う
- 最後に終了メッセージを表示
GUIに関連する小物達
小物として使うのは
- msgbox.vbs(メッセージボックス表示)
- inputbox.vbs(インプットボックス表示)
- commdlg.exe(ファイル選択ダイアログ表示)
- commdlgd.exe(ディレクトリ選択ダイアログ表示)
VBScriptからファイル選択などのコモンダイアログを使うには、Visual Studioのライセンス(ランタイムのことではない)が必要なため、ここでは短いCで書いたコマンドラインのアプリを使います。
本稿は『バッチからアプリケーションの結果を取得し処理を行う』のが目的ですので、VBScriptとCのプログラムの内容についての詳細は割愛します。添付のソースを参照してください(本当に簡単なものです)。