lisz-works

技術系だけど関係ないこと多い系ブログ

【C++】バッチ処理を非表示で行う

【スポンサーリンク】

プログラムのソースコード

どうもlisです。

Visual StudioでWindowsアプリを作成時、バッチファイルをウィンドウ非表示の状態で実行する方法を書いていきます。

やりたかったこととしては、

  • バッチファイルをウィンドウ非表示で実行する
  • バッチ処理内で、リダイレクトによりファイル出力を行う

だったのですが、全て実現することができました。

環境

  • Windows7 Pro 64bit
  • Visual Studio 2010 Pro
  • Windowsフォームアプリケーション

ソース

// インクルード
#include <Windows.h>
#pragma comment( lib, "shell32.lib" )
// 処理
ShellExecute(NULL, L"open", L"cmd.exe", L"/c C:/work/bat/test.bat", L"", SW_HIDE);

解説

ShellExecuteの引数は、下記のようになっています。

  1. 親ウィンドウハンドル
  2. ファイルの処理方法
  3. 実行するファイル名
  4. 実行ファイルに渡すパラメータ
  5. デフォルトディレクトリ
  6. 実行時のウィンドウ表示状態

親ウィンドウハンドル:
NULLでOK。

ファイルの処理方法:
今回は対象ファイルを開くので、「open」です。

実行するファイル:
コマンドプロンプトにバッチファイルを読み込ませて使用する為、コマンドプロンプト(cmd.exe)を指定します。

パラメータ:
コマンドプロンプトに渡すパラメータ値です。
「/c コマンド」と記載することで、実行時に渡すパラメータから実行したいコマンドを指定することができます。
今回はバッチファイルを実行して欲しいので、「/c」とバッチファイルのパスをセットにしたパスを設定します。

デフォルトディレクトリ:
特にないので空文字

ウィンドウ表示状態:
ここを「SW_HIDE」にすることで、ウィンドウを非表示にできます!
逆にSW_SHOWにすると、ウィンドウが表示されます。他にもパラメータはありますがここでは割愛します。

あとがき

最初調べたときCreateProcess()を使用するサイトばかりヒットして、エラーに苛まれながらもCreateProcess()を実行できるまでこぎ着けたにも関わらず、ウィンドウが非表示にならないという苦い経験をしました…

別件を調べているときに、この情報をゲットし、試したところあっさりいけてしまったので微妙に拍子抜けです(笑)