2009-04-24 32 views
5

Tôi đang sinh ra một tiến trình con chạy trong cửa sổ điều khiển có thể nhìn thấy (đó là một tệp lô chạy MSBuild) và tôi muốn có đầu ra được tạo bởi quá trình hiển thị trong cửa sổ bảng điều khiển hiển thị, cũng như nắm bắt đầu ra đó để tôi có thể xử lý nó trong mã. Tôi đã đọc một số câu hỏi khác và các tài liệu MSDN đối phó với ProcessStartInfo.RedirectStandardOutput và như thế, và tôi có thể nắm bắt đầu ra từ dòng chuyển và xử lý nó trong mã tốt:Ghi lại đầu ra tiêu chuẩn và vẫn hiển thị nó trong cửa sổ giao diện

Process msBuild = new Process(); 
msBuild.StartInfo.FileName = "Build.bat"; 
msBuild.StartInfo.UseShellExecute = false; 
msBuild.StartInfo.RedirectStandardOutput = true; 
msBuild.Start(); 
string output = msBuild.StandardOutput.ReadToEnd(); 
msBuild.WaitForExit(); 

Vấn đề là các đầu ra không được hiển thị trong cửa sổ giao diện điều khiển của tiến trình con; Tôi chỉ nhận được một cửa sổ giao diện điều khiển trống trên màn hình trong khi quá trình đang chạy, biến mất khi nó kết thúc.

Tôi cho rằng tôi có thể ẩn cửa sổ tiến trình con thực tế và hiển thị cửa sổ thứ hai mà tôi chỉ viết đầu ra vào khi nó được chụp, nhưng điều đó có vẻ như nhiều công việc hơn là cần thiết. Có cách nào để có đầu ra hiển thị trong cửa sổ giao diện điều khiển và vẫn nắm bắt nó để xử lý khi nó được thực hiện?

Trả lời

3

Khi bạn đã chuyển hướng tiêu chuẩn ra, nó không còn được chuyển hướng trên bảng điều khiển nữa. Để ghi vào bàn điều khiển, bạn sẽ phải thực hiện thủ công.

Nếu bạn muốn hiển thị đầu ra khi quá trình thực hiện, thay vì trong 1 bản kết xuất lớn ở cuối, bạn có thể sử dụng sự kiện "OutputDataReceived" của lớp Process.

+0

Wow - Tôi đã không nhìn thấy OutputDataReceived trước. Khéo léo! –

+0

Điều đó dường như trả lời câu hỏi có hay không tôi có thể có đầu ra được hiển thị trong cửa sổ giao diện điều khiển thuộc sở hữu của quá trình con và chuyển hướng đến quá trình cha mẹ cùng một lúc. Câu hỏi tiếp theo của tôi là, có thể không chuyển hướng đầu ra và chỉ chụp tất cả từ bảng điều khiển khi quá trình thoát không? Hoặc, nếu không, cách tốt nhất để tạo cửa sổ bảng điều khiển theo cách thủ công để tôi có thể viết đầu ra được chuyển hướng đến nó như là quá trình thực hiện (bằng cách sử dụng 'OutputDataReceived')? – mjl5007

+1

Hãy xem http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx. Nó có một ví dụ (bạn có thể muốn tắt tất cả các ngôn ngữ nhưng C#) –

4

Dưới đây là những gì tôi đã được sử dụng, mà không sử dụng một thread riêng biệt:


using(System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
{ 
    proc.EnableRaisingEvents = false; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.CreateNoWindow = true; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.Verb = "open"; 
    proc.StartInfo.FileName = "XXXX"; 
    proc.Start(); 
    String sLine = ""; 
    while ((sLine = proc.StandardOutput.ReadLine()) != null) 
    { 
     System.Console.WriteLine(sLine); 
    } 
    proc.WaitForExit(); //Jon Skeet was here! 
    errorCode = proc.ExitCode; 
    proc.Close(); 
} 
+0

Tôi đã giả định rằng OP muốn quá trình sinh sản tiếp tục chạy - Tôi đã không nhận thấy cuộc gọi đến WaitForExit. Tôi sẽ sử dụng WaitForExit hơn là vòng lặp while của bạn mặc dù - vòng chặt chẽ không phải là một ý tưởng tốt. –

+0

Tôi đang cố gắng nhớ nếu có lý do tôi không sử dụng WaitForExit ở đó. – crashmstr

+0

Nhìn vào lịch sử SVN của tôi, đó là vì tôi từng có nó như "while (! Proc.HasExited) {/ * đọc nội dung ở đây * /}", nhưng điều đó không nhận được tất cả văn bản và khi tôi di chuyển nó bên ngoài vòng lặp đọc, không nghĩ rằng để thay đổi nó thành một WaitForExit. – crashmstr

Các vấn đề liên quan