バッチ(*.bat)からC#のコンソールアプリケーションを実行する。


概要

バッチ(*.bat)からC#で書いたソースコードを実行したい場合の手順を記す。

要件

  • バッチファイルからC#に引数を渡せること
  • ログファイルが出力できること
  • C#からバッチファイルにリターンコードを返却できること

手順

1.Visual Studioでコンソールアプリケーションを新規作成する。

Visual Studioの基本的な操作なので、ここの説明は省きます。

2.コンソールアプリケーションに以下の様なソースを書く。

Program.cs
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            var returnCd = 0; // リターンコード

            // ログファイル
            using (StreamWriter log = CreateLog())
            {
                // 引数が無い場合はエラーとする
                if (args.Length == 0)
                {
                    log.WriteLine("args is null.");
                    returnCd = 1; // リターンコードに1をセットする。
                }
                // 引数が有る場合は引数をログに出力し、処理を終了する
                else
                {
                    // 引数で渡された値をひとつずつログに出力する。
                    for (int i = 0; i < args.Length; i++)
                    {
                        log.WriteLine(args[i]);
                    }
                }
            }
            System.Environment.Exit(returnCd); // リターンコードを返却しながら終了する。
        }

        /// <summary>
        /// ログファイルを生成して返却します
        /// </summary>
        /// <returns>ログファイル</returns>
        private static StreamWriter CreateLog()
        {
            // Create a writer and open the file:
            StreamWriter log;

            if (!File.Exists("C:\\logfile.txt"))
            {
                log = new StreamWriter("C:\\logfile.txt");
            }
            else
            {
                log = File.AppendText("C:\\logfile.txt");
            }
            return log;
        }
    }
}

処理内容のざっくり説明

  1. ログファイルを生成する。
  2. 引数が無い場合は"args is null.とログに出力し、"リターンコード1で終了する。
  3. 引数が有る場合は引数で渡された値をひとつずつログに出力し、リターンコード0で終了する。

コンソールアプリケーションをビルドする。

ビルドした結果に生成されたexeファイルは設定の応じて以下のどちらかのフォルダにあります。

%userprofile%\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\bin\Release

%userprofile%\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug

バッチファイルにて以下のコマンドでコンソールアプリケーションを実行する。

start /wait ConsoleApplication1.exe "パラメータ1" "パラメータ2" "パラメータ3"
echo %ERRORLEVEL% -> 0

今回のケースでは引数を渡さなかった場合、%ERRORLEVEL%は1が返却されます。

ちなみに、startコマンドのwaitオプションはアプリケーションの起動後に終了するまで待機するとのことです。

以上です。

ログファイルを見てみると、以下の様にログがちゃんと出力されていました。

logfile.txt
パラメータ1
パラメータ2
パラメータ3

C#バッチでDB参照やDB更新をする場合は、このコンソールアプリケーションが便利だと思うのですが、日本語の情報があまりなかったのでまとめておきました。

なお、実際の業務で使う場合は、ログ周りをもう少し検討する必要があると思います。