【C#】C#から値が渡されたバッチファイルの実行結果を受け取るには

この記事では、C#から値が渡されたバッチファイルの実行結果を受け取る方法についてご説明します。

【動画】C#から値が渡されたバッチファイルの実行結果を受け取る実際の動き

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


まずはC#からバッチファイルが呼び出されてバッチファイルが実行されます。

バッチファイルを呼び出す際、バッチファイル側に値を渡します。

バッチファイルが実行されると、C#側から渡された値を使って実行された結果をC#側が受け取りテキストボックスに出力しています。

コードの流れ

STEP.1
バッチファイルを元にProcessStartInfoインスタンスを作成する
バッチファイルを元にProcessStartInfoインスタンスを作成します。
STEP.2
バッチファイルに値を渡し、バッチファイルを実行する
バッチファイルに値を渡し、バッチファイルを実行します。
STEP.3
バッチファイルで実行されたコマンドの実行結果を取得する
バッチファイルで実行されたコマンドの実行結果を取得します。
取得した実行結果は、今回テキストボックスに出力しています。

バッチファイルとフォームの例

バッチファイル

今回は下のバッチファイルを用意しました。

@echo off

rem pingの実行
ping %1

バッチファイルには、pingコマンドを実行するコードが記述されており、そのpingコマンドの引数にはバッチファイルの引数「%1」が指定されています。

この引数「%1」には、C#から渡されて受け取った値が格納されています。

今回はC#側からpingコマンドに渡したい値(IPアドレス)がバッチファイルに渡されてこの引数「%1」で受け取ります。

引数「%1」に値(IPアドレス)が格納されたら、その値がpingコマンドの引数に指定されて実行されます。

フォーム

今回は下のフォームを用意しました。

実行ボタンをクリックするとバッチファイルが実行されて、設置されたテキストボックスにpingコマンドの実行結果が出力されます。

先ほどのバッチファイルの実行結果と同じ内容がテキストボックスに出力されています。

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="batFilePath" value="C:\work\10_勉強\21_C#\0059\0059.bat" />

    </appSettings>
</configuration>

注目すべきコード

見て頂きたいのは8行目です。

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

「batFilePath」のキーの値をフォーム側のコードが参照して使います。

ちなみに、今回呼び出すバッチファイル「C:\work\10_勉強\21_C#\0053\0053.bat」は下の画像にあるバッチファイルです。

フォームのコード

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

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

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

            // バッチファイルに渡す引数
            string arguments = "192.168.11.0";

            // バッチファイルを元にProcessStartInfoインスタンスを生成する
            ProcessStartInfo processInfo = new ProcessStartInfo(batFilePath)
            {
                // バッチファイルのウィンドウを表示しないように設定する
                CreateNoWindow = true,

                // バッチファイルの出力結果を標準出力にリダイレクトするように設定する
                RedirectStandardOutput = true,

                // シェル機能を使用せずにプロセスを起動する
                UseShellExecute = false,

                // バッチファイルに渡す引数を設定する
                Arguments = arguments
            };

            // ProcessStartInfoインスタンスを使用してバッチファイルを実行する
            Process process = Process.Start(processInfo);

            // バッチファイルの実行結果を変数outputに格納する
            string output = process.StandardOutput.ReadToEnd();

            // C#側の処理を待機する
            process.WaitForExit();

            // テキストボックスに出力する
            textBox1.Text = output;
        }
    }
}

注目すべきコード①

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

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

コードの説明

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

「batFilePath」のキーの値は変数「batFilePath」に格納します。

注目すべきコード②

次に見て頂きたいのは21行目です。

            // バッチファイルに渡す引数
            string arguments = "192.168.11.0";

コードの説明

以上のコードは、バッチファイルに渡したい値(引数)を取得するコードです。

変数argumentに、バッチファイルに渡したい値(引数)を格納しています。

何かバッチファイルに値を渡したい場合はここでその値を指定します。

今回はバッチファイル側に値「192.168.11.0」を渡します。

注目すべきコード②

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

            // バッチファイルを元にProcessStartInfoインスタンスを生成する
            ProcessStartInfo processInfo = new ProcessStartInfo(batFilePath)
            {
                // バッチファイルのウィンドウを表示しないように設定する
                CreateNoWindow = true,

                // バッチファイルの出力結果を標準出力にリダイレクトするように設定する
                RedirectStandardOutput = true,

                // シェル機能を使用せずにプロセスを起動する
                UseShellExecute = false,

                // バッチファイルに渡す引数を設定する
                Arguments = arguments
            };

コードの説明

以上のコードは、バッチファイルを元にProcessStartInfoインスタンスを生成して、バッチファイルを実行する際の各情報を設定します。

コードの詳細

24行目のコードは、バッチファイルを元にProcessStartInfoインスタンスを生成します。

このインスタンスを生成することで、バッチファイルを実行したり、実行するバッチファイルの設定を色々と行うことができます。

27行目のコードでは、CreateNoWindowプロパティにtrueを設定しています。

CreateNoWindowプロパティにtrueを設定することで、バッチファイルのウィンドウが表示されなくなります。

30行目のコードでは、RedirectStandardOutputプロパティにtrueを設定しています。

RedirectStandardOutputプロパティにtrueを設定することで、バッチファイルの実行結果を直接読み取ることができるようになります。

33行目のコードでは、UseShellExecuteプロパティにfalseしています。

UseShellExecuteプロパティにfalseを設定することで、シェル経由で実行されず、バッチファイルの起動が直接実行されて高速化されます。(パフォーマンスの向上)

36行目のコードでは、Argumentsプロパティに値を設定することで、以下のイメージの通りにバッチファイル側の引数に値を渡すことができます。

今回は変数argumentsに「192.168.11.0」の値を設定しているので、バッチファイル側の「%1」にこの「192.168.11.0」が渡されて、pingコマンドの引数としてpingコマンドが実行されます。

注目すべきコード③

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

            // ProcessStartInfoインスタンスを使用してバッチファイルを実行する
            Process process = Process.Start(processInfo);

            // バッチファイルの実行結果を変数outputに格納する
            string output = process.StandardOutput.ReadToEnd();

            // C#側の処理を待機する
            process.WaitForExit();

            // テキストボックスに出力する
            textBox1.Text = output;

コードの説明

以上のコードは、ProcessStartInfoインスタンスを使用してバッチファイルを実行し、実行結果をテキストボックスに格納する処理のコードです。

コードの詳細

40行目のコードでは、ProcessStartInfoインスタンスを使用してバッチファイルを実行します。

43行目のコードでは、バッチファイルの実行結果を変数outputに格納します。

46行目のコードでは、バッチファイルの処理よりもC#側の処理が先に終わらないよう、C#側の処理を待機します。

49行目のコードでは、バッチファイルの実行結果が格納された変数outputの値をテキストボックスに出力します。

動作確認

バッチファイルとフォームの例」をご覧ください。

最後に

この記事では、C#から値が渡されたバッチファイルの実行結果を受け取る方法についてご説明します。

C#から値が渡されたバッチファイルの実行結果を受け取りたい場合は本記事を参考にして頂けたら幸いです。

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

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

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

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