2012-01-19 4 views
2

アプリケーションからバッチファイルを呼び出そうとしていますが、コマンドウィンドウを非表示にし、標準出力を(バッチファイルによって生成された)1つ以上の場所にリダイレクトする必要があります。バックグラウンドでバッチファイルをどのように起動し、その出力をリダイレクトしますか?

私の問題は、バッチファイルが実行されているときに、コンソールが起動して何も表示されないことです。それはちょうど上です。タスクが完了すると、コンソールが閉じます。私はコンソールを取り除きたいと思う(おそらくそれはバックグラウンドで実行している)。

もう1つの問題は、出力をリッチテキストボックスにリダイレクトしていることです。コンソールやテキストボックスにリダイレクトすると、すべての結果がすぐに吐き出されます。私はそれが起こるように行ごとに吐き出すことを望みます。理にかなっている?

コードは以下の通りです:

//Declare and instantiate a new process component. 
    System.Diagnostics.Process process1; 
    process1 = new System.Diagnostics.Process(); 
    process1.StartInfo.UseShellExecute = false; 
    process1.StartInfo.RedirectStandardOutput = true; 
    process1.StartInfo.FileName = "cmd.exe"; 
    process1.StartInfo.Arguments = "<BATCHfILE>"; 
    process1.Start(); 

    string output = process1.StandardOutput.ReadToEnd(); 
    rchsdtOut.Text = output; 

    Console.WriteLine(process1.StandardOutput.ReadToEnd()); 

    process1.WaitForExit(); 
    process1.Close(); 

答えて

1

これは、私はそれを行っているだろうかです。

追加:

process1.CreateNoWindow = true, 
process1.OutputDataReceived += (s, e) => myMethod(e); 
process1.BeginOutputReadLine(); 

そして、コメントに記載されたクロススレッド操作の問題を解決する方法

private void myMethod(DataReceivedEventArgs e) 
{ 
    //Do something with e.Data 
} 

を私が正しくあなたの質問を理解願っています。あなたは(関数が始まる前に)あなたのフォームクラスにこれを追加する必要があります。

private void update_richTextBox1(string value) 
{ 
    richTextBox1.Text += value; 
} 

そしてMyMethodは機能の追加:

richTextBox1.Invoke(new updateText(update_richTextBox1), new object[] { e.Data.ToString() }); 

private delegate void updateText(string str); 

は、その後、あなたがこれを追加する必要があります

+0

私はこれを試してみましょう。 – user1158745

+0

あなたは上記のことをやったのですが、行ごとにコンソール上のイベントを印刷しているわけではありません。それを1つのチャンクにまとめるだけです。 – user1158745

+0

申し訳ありませんが、私の間違いです。私はちょうどコンソールに書き込もうとしていますが、何も書いていません。 Console.WriteLine(e.Data.ToString()); – user1158745