0

私は次のようなコードを使用しています:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();

startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C SomeEXE inputfile.txt";
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;

process.StartInfo = startInfo;
process.Start();

// Now use streams to capture the output
StreamReader outputReader = process.StandardOutput;

process.WaitForExit();

String line = outputReader.ReadToEnd();

これは正常に機能します。ただし、発行されたコマンド(SomeEXE)により、実際の結果を含む別のコマンドプロンプトが開かれ、キャリッジリターンが閉じられるのを待ちます。この出力を取得してキャリッジリターンを発行することは可能ですか?ありがとう。

4

1 に答える 1

4

SomeEXEを直接起動する

新しいコマンドインタープリターを介さずにSomeEXEを直接起動すると、stdoutをoutputReaderにリダイレクトして出力を取得する既存のコードが機能します。これを行うには、コードを次のように変更します。

startInfo.FileName = "SomeEXE";
startInfo.Arguments = "inputfile.txt";

stdinを独自のストリームにリダイレクトして、キャリッジリターンを発行することもできます。

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput.aspx

キーポイント:

myProcess.StartInfo.RedirectStandardInput = true;
StreamWriter myStreamWriter = myProcess.StandardInput;

Environment.NewLineをmyStreamWriterに書き込みます。

ただし、これを行っていないため、コマンドインタープリターのコンソールをキャプチャしています。

SomeEXEのコードを管理している場合

SomeEXEを制御できる場合は、親のコンソールに接続するように指示できます。

http://www.csharp411.com/console-output-from-winforms-application/

MSDNの例では、例外処理が非常に貧弱であることに注意してください。例外がスローされた場合、例のストリームを閉じることができません。ストリームを破棄する最も簡単な方法は、ステートメント を使用してストリームをラップすることです。

SomeEXEが子プロセスを生成する場合

SomeEXEのコードを制御できず、SomeEXEが子プロセスを生成している場合、孫コンソールからstdin/stdoutを取得するタスクはより困難になります。ただし、それは可能です。

問題の実際のコンソールウィンドウのプロセスIDを取得する必要があります。

次に、Win32 API AttachConsoleを使用して、孫プロセスのコンソールを独自のコンソールにアタッチできます。

于 2012-09-11T15:52:59.630 に答える