C# 调用cmd.exe的方法

时间:2023-12-18 13:13:44

网上有很多用C#调用cmd的方法,大致如下:

[c-sharp] view plaincopy

  1. private void ExecuteCmd(string command)  
  2. {  
  3. Process p = new Process();  
  4. p.StartInfo.FileName = "cmd.exe";  
  5. p.StartInfo.UseShellExecute = false;  
  6. p.StartInfo.RedirectStandardInput = true;  
  7. p.StartInfo.RedirectStandardOutput = true;  
  8. p.StartInfo.CreateNoWindow = true;  
  9. p.Start();  
  10. p.StandardInput.WriteLine(command);  
  11. p.StandardInput.WriteLine("exit");  
  12. p.WaitForExit();  
  13. this.textBox1.Text=textBox1.Text+ p.StandardOutput.ReadToEnd();  
  14. p.Close();  
  15. }
上面代码有几个不足,一是必须要exit那一句,否则就会死循环。

再就是每次执行Execute执行cmd后,都必须等到cmd执行完且cmd.exe进程退出,才能读到结果。有时候这样会让

我们的应用程序失去操作的连续性。

事实上,通过两个线程,一个访问输入管道,一个访问输出管道,可以很容易实现持续性的效果,

下面是一个Console程序:




[c-sharp] view plaincopy
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading; 
  6. using System.Diagnostics; 
  7. namespace cmdtest 
  8. class Program 
  9. public static string cmd_str; 
  10. public static string cmd_outstr; 
  11. public static Process p = new Process(); 
  12. static void Main(string[] args) 
  13. p.StartInfo.FileName = "cmd.exe"; 
  14. p.StartInfo.UseShellExecute = false; 
  15. p.StartInfo.RedirectStandardInput = true; 
  16. p.StartInfo.RedirectStandardOutput = true; 
  17. p.StartInfo.RedirectStandardError = true; 
  18. p.StartInfo.CreateNoWindow = true; 
  19. p.Start(); 
  20. cmd_str = ""; 
  21. cmd_outstr = ""; 
  22. Thread t1 = new Thread(new ThreadStart(DoCmdThread)); 
  23. t1.Start(); 
  24. Thread t2 = new Thread(new ThreadStart(OutCmdThread)); 
  25. t2.Start(); 
  26. while(true) 
  27. cmd_str = Console.ReadLine(); 
  28. Thread.Sleep(10); 
  29. if (cmd_str == "exit") 
  30. break; 
  31. public static void DoCmdThread() 
  32. while (true) 
  33. if (cmd_str == "exit") 
  34. break; 
  35. if (cmd_str != "") 
  36. p.StandardInput.WriteLine(cmd_str); 
  37. //p.StandardInput.WriteLine("cd"); 
  38. cmd_str = ""; 
  39. Thread.Sleep(1); 
  40. public static void OutCmdThread() 
  41. while (true) 
  42. if (cmd_str == "exit") 
  43. p.StandardInput.WriteLine("exit"); 
  44. p.WaitForExit(); 
  45. p.Close(); 
  46. break; 
  47. cmd_outstr = p.StandardOutput.ReadLine(); 
  48. while(cmd_outstr != "") 
  49. Console.WriteLine(cmd_outstr); 
  50. cmd_outstr = p.StandardOutput.ReadLine(); 
  51. char[] ch = new char[256]; 
  52. int c = p.StandardOutput.Read(ch, 0, 256); 
  53. if (c > 0) 
  54. Console.Write(ch,0,c); 
  55. Thread.Sleep(1); 
  56. }