3

アプリケーションをコンソールモードで実行すると、コンソールに行が書き込まれます。

これをプログラムで実行したいと思います。これが私が使用したいくつかのサンプルコードです:OutputDataReceivedイベントのMSDN

private static StringBuilder _sortOutput = null;

var proc = new Process();
                var info = new ProcessStartInfo();
            info.FileName = @"C:\SomeApp.exe";

            info.UseShellExecute = false;
            info.WindowStyle = ProcessWindowStyle.Normal;
            info.CreateNoWindow = false;

            proc.StartInfo = info;

            info.RedirectStandardOutput = true;
            info.RedirectStandardError = true;

            proc.OutputDataReceived += HandleOutputData;
            proc.ErrorDataReceived += HandleOutputData;

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

            proc.WaitForExit();

            var exitCode = proc.ExitCode;
            var output = _sortOutput.ToString();


    private void HandleOutputData(object sender, DataReceivedEventArgs e)
    {
        _sortOutput.Append(e.Data);
    }

ただし、DataReceivedEventArgs.Dataは常にnullであり、開いたコンソールウィンドウに表示される結果が返されません。

どうすれば出力を受け取ることができますか?それを達成する方法はありますか?

アップデート

また、直接読み取ろうとしましたproc.StandardOutputが、データが得られません。

4

3 に答える 3

3

他の誰かが発見した_sortOutputように、nullになるバグがあります。しかし、それにもかかわらず、あなたは完全に正しいです:e.Datanullになる可能性があります!

実際、呼び出しを行っているAsyncStreamReaderがリダイレクトされている標準出力のEOFに達した場合、ハンドラーは常にe.Datanullに等しい値で呼び出される必要があります。これは、実行中のプロセスが終了したときに発生します。もちろん、最初にOutputDataReceivedイベントハンドラーの登録を解除するか、非同期出力リダイレクトをキャンセルしない限り。

于 2015-10-20T23:24:38.157 に答える
2

でデータを読み取るため、nullです。var outPut

次のことを試してください。

a)あなたがそれを扱う方法を変える

proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);

b)行をコメントアウトする

//var outPut = proc.StandardOutput.ReadToEnd();
于 2013-03-12T12:24:18.970 に答える
2

Nullは、非同期ストリームの終了を意味します。WaitForExitと、終了するnullがe.Dataを通過するのを待つ必要があります

于 2016-06-23T15:38:34.913 に答える