1

このトピックに関する以前の質問のいずれも、この問題に対する回答を提供しているとは思いません。psexec を使用してリモート exe ファイルを実行します。コマンドラインで実行すると、exeファイルの出力が得られます。psexec.exe \\machine C:\somename.exe.
C Sharp Process Execution を使用すると、ハングするか、出力がリダイレクトされません。一部のexeではタイムアウトになり、一部のリダイレクトされた標準出力では空になり、エラーにはコード0で終了したExeが含まれます。出力をキャプチャする方法はありますか?

 ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName =GetPsExecPath();
        startInfo.Arguments = arguments;
        Debug.WriteLine(arguments);
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardError = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.CreateNoWindow = true;
        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
        process.WaitForExit();
        error = process.StandardError.ReadToEnd();
        output = process.StandardOutput.ReadToEnd();
        Debug.WriteLine(error);
        Debug.WriteLine(output);
        process.close();

編集: Soln したがって、この問題は主に、Psexec が他の多くのものを stderr にスローするため、それらを読み取る順序が原因であり、ReadToEnd() を使用するとデッドロックにつながる可能性があります。したがって、BeginOutputReadLine を使用すると、魅力的に機能します。

4

1 に答える 1

4

このコード スニペットは、デッドロックを引き起こす可能性が非常に高くなります。最初に StandardError を読み、次に StandardOutput を読みます。これは、プロセスが終了するまで process.StandardOutput.ReadToEnd() が呼び出されないことを意味します。つまり、十分な文字数でいっぱいになると、psexec は stdout 出力バッファーをフラッシュできなくなります。つまり、ブロックされるため、終了することはありません。デッドロックシティ。

2 つの呼び出しを入れ替えると、確率がはるかに高くなります。ほとんどのプログラムは、大量の出力を stdout に送信します。ただし、何らかの理由で psexec が多くの文字を stderr に書き込む場合、デッドロックの可能性はゼロではありません。代わりに BeginOutputReadLine と BeginErrorReadLine を使用して、これを完全に排除します。

于 2012-04-25T12:26:48.127 に答える