2009-07-23 34 views
9

Tôi mới dùng C# và cố gắng phát triển một ứng dụng nhỏ mở nội bộ lệnh nhắc và thực thi một số lệnh tại đây. Đây là những gì tôi đã thực hiện cho đến thời điểm này:Đang chờ lệnh hoàn thành trong C#

m_command = new Process(); 
    m_command.StartInfo.FileName = @"cmd.exe"; 
    m_command.StartInfo.UseShellExecute = false; 
    m_command.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    m_command.StartInfo.CreateNoWindow = true; 
    m_command.StartInfo.RedirectStandardInput = true; 
    m_command.StartInfo.RedirectStandardOutput = true; 

    m_command.Start(); 

    m_reader = m_command.StandardOutput; 
    m_writer = m_command.StandardInput; 

    m_writer.WriteLine("Somecommand"); //execute some command 

Như bạn có thể thấy, tôi đã chuyển hướng đầu vào và đầu ra. Câu hỏi của tôi là làm thế nào để tôi thực hiện "một số lệnh" đồng bộ tức là tôi muốn đọc kết quả của lệnh của tôi bằng cách sử dụng đầu ra được chuyển hướng. Cho rằng tôi phải chờ cho đến khi lệnh tôi gọi bằng cách sử dụng WriteLine để hoàn thành. Làm thế nào để làm điều đó?

Trả lời

15

Đó thực sự phụ thuộc vào những gì các lệnh sẽ làm. Bạn có thể đợi quá trình thoát với Process.WaitForExit, trong khi đọc đồng thời từ m_reader trong một chủ đề khác hoặc với OutputDataReceived. Điều đó sẽ chỉ hoạt động nếu quá trình sẽ thoát khi lệnh đã kết thúc. (Lưu ý rằng bạn để đọc đầu ra, nếu không nó có thể lấp đầy bộ đệm đầu ra và về cơ bản chặn quá trình.)

Tùy chọn khác là nếu bạn sẽ nhận được một chút đầu ra khi lệnh kết thúc - chẳng hạn như dấu nhắc lệnh tiếp theo. Vấn đề là nếu lệnh của bạn xảy ra để xuất ra cùng một thứ, bạn sẽ hiểu sai.

Dường như việc khởi chạy lời nhắc lệnh như thế này không phải là một cách tiếp cận tuyệt vời. Bất kỳ lý do bạn không tạo ra một quá trình riêng biệt mỗi lần?

Một lựa chọn khác: nếu bạn có thể làm việc ra những gì bạn đã xử lý vừa tung ra qua dòng lệnh, bạn có thể thấy rằng khi một Process và chờ cho rằng để thoát. Đó là khó khăn mặc dù - Tôi thực sự sẽ cố gắng thiết kế lại giải pháp của bạn.

9

Bạn có thể gọi

m_command.WaitForExit(); 
+1

Nhưng tôi không muốn cửa sổ lệnh đóng lại. Tôi muốn sử dụng lại cùng một dấu nhắc lệnh để thực hiện một số lệnh khác. Phương pháp này vẫn hoạt động? – Naveen

+0

Điều đó sẽ đợi cho đến khi cmd.exe đóng, nhưng bỏ qua phần cuối của "somecommand". –

+0

Bạn luôn có thể thêm m_writer.WriteLine ("exit"); –

3

Cách đơn giản nhất là nên đặt tất cả các lệnh vào một file cmd, thực hiện điều đó và sử dụng

Process.Start("cmdfile").WaitForExit(); 
8

Đây là những gì tôi được sử dụng trong một dự án nhỏ tôi đã thực hiện:

processStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.CreateNoWindow = true; 
    startInfo.UseShellExecute = false; 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.FileName = "cmd.exe"; 
    startInfo.Arguments = command; 

// Start the process with the info we specified. 
    // Call WaitForExit and then the using statement will close. 
    using(Process exeProcess = Process.Start(startInfo)) 
    { 
     exeProcess.WaitForExit(); 
    } 
0

Bạn có thể đợi dấu nhắc ở đầu ra.

Khá phức tạp quá.

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