0

プロセスを起動してデータをstdinにプッシュする方法についていくつか質問がありますが、出力の行き先を制御する方法についてはわかりません。

まず、コンソールモードのC#アプリケーションから実行する現在のコードを次に示します。

    // Prepare the process to run
    ProcessStartInfo start = new ProcessStartInfo();
    // Enter in the command line arguments, everything you would enter after the executable name itself
    start.Arguments = " -";
    // Enter the executable to run, including the complete path
    start.FileName = "doxygen.exe";
    // Do you want to show a console window?
    start.WindowStyle = ProcessWindowStyle.Normal;
    start.CreateNoWindow = false;
    start.RedirectStandardInput = true;
    start.UseShellExecute = false;

    // Run the external process & wait for it to finish
    using (Process proc = Process.Start(start))
    {
        //doxygenProperties is just a dictionary
        foreach (string key in doxygenProperties.Keys)
            proc.StandardInput.WriteLine(key+" = "+doxygenProperties[key]);
        proc.StandardInput.Close();
        proc.WaitForExit();

        // Retrieve the app's exit code
        int exitCode = proc.ExitCode;
    }

これを実行すると、新しいウィンドウが表示され(必要だと思いますが)、doxygen.exeのすべてのstdoutがアプリのコンソールウィンドウに出力されます。

私がしたいのは、次の2つのうちの1つです。

  1. Doxygenは表示されているウィンドウで起動され、アプリのウィンドウではなく、そのウィンドウでstdoutを確認できます。
  2. Doxygenは非表示のウィンドウで起動され、そのstdoutはログファイルに書き込まれます。

どうすればこれらを達成できますか?

さらに、スポーンされたプロセス用に別のウィンドウが表示されないのはなぜですか?また、スポーンされたプロセスが自分のウィンドウに出力を書き込んでいるのはなぜですか?

4

2 に答える 2

2

あなたができることの一つは使用することであり、使用するRedirectStandardOutput代わりにWaitForExitあなたは使用することができますReadToEnd

ProcessStartInfo start = new ProcessStartInfo();
start.RedirectStandardOutput = true;

//make other adjustments to start

Process p = new Process();
p.StartInfo = start;
p.Start();
string output = p.StandardOutput.ReadToEnd();

そして、あなたはstring outputあなたの余暇で使うことができます


リアルタイムで出力を取得したい場合、p.StandardOutputプロパティには、出力を非同期で取得できるメソッドがあります。私はそれのすべての詳細をすぐに知りません、私はそれを以前に一度だけ使用しました、しかしあなたがそれを検索するならばそこにたくさんの文献があります。


StandardOutputまた、両方をStandardError同時に リダイレクトする場合も注意してください。十分な長さの場合、デッドロックが発生する可能性があります。

于 2013-01-10T18:52:43.557 に答える
0

あなたは2つのことをする必要があります:

1)プロセスでRedirectStandardOuputプロパティをtrueに設定して、プロセスの標準出力をアプリに送信することを示します。

2)を呼び出す前にWaitForExit、出力のキャプチャを開始します。

string sOutput = p.StandardOutput.ReadToEnd();

wait for exitを呼び出す前に出力の読み取りを開始しないと、デッドロックが発生する可能性があります。

ただし、標準出力は出力情報のみをキャプチャし、アプリの標準エラーストリームに書き込まれるものは何もキャプチャしないことを知っておくことが重要です。

両方の情報ストリームをキャプチャするために、プロセスのOutputDataReceivedイベントとErrorDataReceivedイベントをフックして、イベントデータをログファイルに直接書き込むか、プロセスの完了後に使用するためにクラスプロパティに保存できます。

于 2013-01-10T19:03:08.213 に答える