2012-01-19 85 views
2

我試圖從應用程序中調用批處理文件,但我希望隱藏命令窗口並將標準輸出重定向到一個或多個位置(因爲它是由批處理文件生成的)。如何在後臺啓動批處理文件並重定向其輸出?

我的問題是,當批處理文件運行時,控制檯啓動並且不顯示任何內容;它剛起來。任務完成後,控制檯關閉。我想擺脫控制檯(也許它在後臺運行)。

另一個問題是我將輸出重定向到richtext框。如果我將它重定向到控制檯或文本框,它只是一次吐出所有結果。我希望它能夠一行一行地吐出來。合理?

的代碼如下:

//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 delegate void updateText(string str); 

然後你需要補充一點:

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

然後在myMethod的功能添加:

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

讓我試試這個。 – user1158745

+0

所以,你剛剛說的是上面所說的,但它不是直接在dos控制檯上直接打印事件,而只是將它全部打包在一個塊中。 – user1158745

+0

對不起,我的錯誤。我現在只是試圖讓它寫入控制檯,但它沒有寫任何東西。 Console.WriteLine(e.Data.ToString()); – user1158745

相關問題