【C#】C#から引数を渡してバッチファイルを実行するには

この記事では、C#から引数を渡してバッチファイルを実行する方法についてご説明します。

【動画】C#から引数を渡してバッチファイルを実行する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


Process.Start メソッドを使い、指定したバッチファイルに引数を渡して実行しています。

コードの流れ

STEP.1
Process.Start メソッドを使い、指定したバッチファイルに引数を渡して実行する
Process.Start メソッドを使い、指定したバッチファイルに引数を渡して実行します。

バッチファイルの例

今回呼び出すバッチファイルは以下の通りです。

このバッチファイルのコードは以下の通りです。

@echo off

rem コピー元のファイルの格納先のパス
set "frmPath=%~1"

rem コピーするファイル名
set "fileName=%~2"

rem コピー先のフォルダのパス
set "toPath=%~3"

rem ファイルをコピーする
copy "%frmPath%\%fileName%" "%toPath%\%fileName%"

以上のコードは、「C:\work\10_勉強\21_C#\0041\from」配下にある「test.txt」を、「C:\work\10_勉強\21_C#\0041\to」配下にコピーする処理です。

なお、このバッチファイルは3つの引数「%~1」「%~2」「%~3」を必要とします。

単体で実行することはできず、実行するにはこの3つの引数を渡してあげる必要があります。

3つの引数を受け取ると、copyコマンドが実行されて、ファイルがコピーされます。

1つ目の引数(%~1)はコピー元のファイルの格納先のパスを、2つ目の引数(%~2)はコピーするファイル名を、3つ目の引数(%~3)はコピー先のフォルダのパスを受け取り、copyコマンドの引数に指定し実行します。

  1. 1つ目の引数(%~1):コピー元のファイルの格納先のパス
  2. 2つ目の引数(%~2):コピーするファイル名
  3. 3つ目の引数(%~3):コピー先のフォルダのパス

なので、存在するコピー元とコピー先のパス、そしてコピーするファイル名が渡されれば正常にファイルがコピーされます。

今回はコピー元ファイルの格納先のパスとファイルに「C:\work\10_勉強\21_C#\0042\from」「test.txt」を、コピー先のフォルダパスを「C:\work\10_勉強\21_C#\0042\to」で指定してバッチファイルを実行してみます。

今回用意したコピー元ファイルの格納先のパスとファイルは下のとおりです。

この「test.txt」のファイルを「C:\work\10_勉強\21_C#\0042\to」配下にコピーします。

コピーした結果は下のとおりです。

以上で、C#から引数がバッチファイルに渡されて実行されて、正常に処理が実行されたことが確認できました。

C#のコード(例)

App.configのコード

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>

    <appSettings>

        <!-- 実行したいバッチファイル名 -->
        <add key="batFile" value="C:\work\10_勉強\21_C#\0042\0042.bat" />

        <!-- コピー元のファイルの格納先のパス -->
        <add key="frmPath" value="C:\work\10_勉強\21_C#\0042\from" />

        <!-- コピーするファイル名 -->
        <add key="fileName" value="test.txt" />

        <!-- コピー先のフォルダのパス -->
        <add key="toPath" value="C:\work\10_勉強\21_C#\0042\to" />
    </appSettings>
</configuration>

コードの説明

以上のコードは、引数を渡してバッチファイルを実行するのに必要な接続文字列を各キーに設定しているコードです。

10行目は、バッチファイルのフルパスを「batFile」というキーに設定しているコードです。

13行目は、コピー元のファイルの格納先のパスを「frmPath」というキーに設定しているコードです。

16行目は、コピーするファイル名を「fileName」というキーに設定しているコードです。

19行目は、コピー先のフォルダのパスを「toPath」というキーに設定しているコードです。

この「batFile」「frmPath」「fileName」「toPath」のキーの値を、フォーム側のコードが参照して使います。

フォームのコード

using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Configuration;

namespace wfcs_0042
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // App.configのappSettingsタグ内に記述した「DBPath」のキーの値を取得して変数「DBPath」に格納する
            string batFile = ConfigurationManager.AppSettings["batFile"];

            // コピー元のファイルの格納先のパス
            string frmPath = ConfigurationManager.AppSettings["frmPath"];

            // コピーするファイル名
            string fileName = ConfigurationManager.AppSettings["fileName"];

            // コピー先のフォルダのパス
            string toPath = ConfigurationManager.AppSettings["toPath"];

            // ProcessStartInfoインスタンスを生成する
            ProcessStartInfo startInfo = new ProcessStartInfo();

            // 起動するプログラムを指定する(今回実行するのはバッチファイル)
            startInfo.FileName = batFile;

            // 起動するプログラムに渡す引数を指定する
            startInfo.Arguments = $"\"{frmPath}\" \"{fileName}\" \"{toPath}\"";

            // バッチファイルを実行する
            Process.Start(startInfo);
        }
    }
}

注目すべきコード①

最初に見て頂きたいのは18行目から27行目です。

            // App.configのappSettingsタグ内に記述した「DBPath」のキーの値を取得して変数「DBPath」に格納する
            string batFile = ConfigurationManager.AppSettings["batFile"];

            // コピー元のファイルの格納先のパス
            string frmPath = ConfigurationManager.AppSettings["frmPath"];

            // コピーするファイル名
            string fileName = ConfigurationManager.AppSettings["fileName"];

            // コピー先のフォルダのパス
            string toPath = ConfigurationManager.AppSettings["toPath"];

コードの説明

以上のコードは、App.configのappSettingsタグ内に記述したキーの値を取得して変数に格納するコードです。

コードの詳細

18行目のコードは、「batFile」のキーの値を変数「batFile」に格納します。

21行目のコードは、「frmPath」のキーの値を変数「frmPath」に格納します。

24行目のコードは、「fileName」のキーの値を変数「fileName」に格納します。

27行目のコードは、「toPath」のキーの値を変数「toPath」に格納します。

注目すべきコード②

次に見て頂きたいのは30行目から39行目です。

            // ProcessStartInfoインスタンスを生成する
            ProcessStartInfo startInfo = new ProcessStartInfo();

            // 起動するプログラムを指定する(今回実行するのはバッチファイル)
            startInfo.FileName = batFile;

            // 起動するプログラムに渡す引数を指定する
            startInfo.Arguments = $"\"{frmPath}\" \"{fileName}\" \"{toPath}\"";

            // バッチファイルを実行する
            Process.Start(startInfo);

コードの説明

以上のコードは、バッチファイルに引数を渡して実行する処理のコードです。

コードの詳細

30行目のコードでProcessStartInfoインスタンスを生成し、33行目で実行するプログラムを指定します。

今回実行するのはバッチファイルなので、「注目すべきコード①」で取得したバッチファイルをFileNameプロパティに設定します。

36行目では、バッチファイルに渡したい引数の値をArgumentsプロパティに指定します。

今回は「frmPath」「fileName」「toPath」の3つの値を指定します。

この「frmPath」「fileName」「toPath」の値がバッチファイル側に渡されます。

以上でバッチファイルを実行する準備が整ったので、39行目のStartメソッドでバッチファイルを実行します。

動作確認

「バッチファイルの例」をご覧ください。

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。

「System.Configuration」の項目を追加しないと、「ConfigurationManager」が存在しないとのことでエラーになってしまいます。

本コードを実行する際は、「System.Configuration」の項目を追加しましょう。

最後に

この記事では、C#から引数を渡してバッチファイルを実行する方法についてご説明しました。

C#から引数を渡してバッチファイルを実行したいときは本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら