C#コードから起動したプロセスの標準入力に、なにか入力する(Y/Nみたいなのを自動で入力する)

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

以前の記事でやったようなのを、C#から起動したコマンドでもやりたい。

コマンドを起動した後に、YesかNoかを聞かれる場合に、自動で「Y」と入力したことにしたい。

サンプルコード

実験用に、標準出力と標準エラー出力に、出力を行ったあと、標準入力から読み込みを行う子プロセスと、 それを呼び出して、そいつの標準入力に対して入力を行う親プロセスを作ってみた。

親プロセス

using System.Diagnostics;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var si = new ProcessStartInfo()
            {
                FileName = @"TestProcess.exe", 
                //CreateNoWindow = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                RedirectStandardInput = true, //★標準入力を渡せるようリダイレクトさせる
                UseShellExecute = false,
            };
            
            using (var proc = new Process())
            {
                proc.StartInfo = si;

                proc.OutputDataReceived += (sender, ev) =>
                {
                    Debug.WriteLine($"標準出力 {ev.Data}");
                };
                proc.ErrorDataReceived += (sender, ev) =>
                {
                    Debug.WriteLine($"標準エラー出力 {ev.Data}");
                };

                proc.Start();
                proc.BeginErrorReadLine();
                proc.BeginOutputReadLine();

                // ★入力のストリームを取得
                using(var sw = proc.StandardInput)
                {
                    if (sw.BaseStream.CanWrite)
                        sw.WriteLine("ABC");
                }

                proc.WaitForExit();
            }

            Debug.WriteLine("プログラム終了");
        }
    }
}

子プロセス

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

            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(i.ToString());
                Thread.Sleep(100);
            }

            for (int i = 0; i < 5; i++)
            {
                Console.Error.WriteLine((i+10).ToString());
                Thread.Sleep(100);
            }

            var input = Console.ReadLine();
            Console.WriteLine("標準入力を受け取りました:" + input);
        }
    }
}

親プロセスの実行出力結果

標準出力 0
標準出力 1
標準出力 2
標準出力 3
標準出力 4
標準エラー出力 10
標準エラー出力 11
標準エラー出力 12
標準エラー出力 13
標準エラー出力 14
標準出力 標準入力を受け取りました:ABC
標準エラー出力 
標準出力 
プログラム終了

子プロセスが、下から4行目で「標準入力を受け取りました:ABC」を出力するが、

親が子の標準出力を自分にリダイレクトしてるので、結局親側のログに残る。 (子側のコマンドプロンプト黒画面には出ない。)

参考

DOSコマンドを実行し出力データを取得する

https://dobon.net/vb/dotnet/process/standardoutput.html