もくじ
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コマンドを実行し出力データを取得する