4

コマンドプロンプトコマンドを実行して、C#で出力を読み取ろうとしています。これは私のコードです:

ProcessStartInfo cmdInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
cmdInfo.CreateNoWindow = true;
cmdInfo.RedirectStandardOutput = true;
cmdInfo.UseShellExecute = false;

Process cmd = new Process();
cmd.StartInfo = cmdInfo;
cmd.Start();
string result = cmd.StandardOutput.ReadToEnd();
cmd.WaitForExit();
cmd.Close();
return result;

ほとんどの場合は機能しますが、使用しているコマンドでそれが不可能な場合はresult = ""になることがあります(たとえば、route addは成功または失敗時に出力を提供する必要があります)。何か案は?プロセスとReadToEnd呼び出しの間に競合状態を作成したのではないかと思っていましたか?

4

1 に答える 1

6

すべての出力が StandardOutput に書き込まれるわけではありません。何か問題が発生した場合、多くのアプリケーションは代わりに StandardError に書き込みます。すべての出力を取得するには、両方から読み取る必要があります。

アプリケーションが入力をブロックしない限り、ReadToEnd()両方の出力ストリームを呼び出してすべての出力を取得しても安全です。ただし、より安全なオプションは、イベントをOutputDataReceivedおよびErrorDataReceivedイベントに接続することです。ローカル変数を閉じるラムダ式をこれらにアタッチして、物事を非常に簡単にすることができます。

var output = new StringBuilder();
var error = new StringBuilder();

cmd.OutputDataReceived += (o, e) => output.Append(e.Data);
cmd.ErrorDataReceived += (o, e) => error.Append(e.Data);

cmd.Start();
cmd.BeginOutputReadLine();
cmd.BeginErrorReadLine();
cmd.WaitForExit();
于 2012-06-16T01:27:08.560 に答える