1 //Minute 2 const int _defaultTimeOut = 24 * 60; 3 4 /// <summary> 5 /// 执行命令行 6 /// </summary> 7 /// <param name="cmdLine">程序集名称(或批处理文件)</param> 8 /// <param name="args">参数</param> 9 /// <param name="outputsAction">处理命令行的输出流信息</param> 10 /// <param name="errorsAction">处理命令行的错误输出信息</param> 11 /// <param name="timeOut">超时时间(单位:分钟)</param> 12 public static void ExecuteCommandeLine(String cmdLine, String args, Action<object, DataReceivedEventArgs> outputsAction, Action<object, DataReceivedEventArgs> errorsAction, int timeOut = _defaultTimeOut) 13 { 14 Process process = new Process(); 15 process.StartInfo.RedirectStandardError = true; 16 process.StartInfo.RedirectStandardOutput = true; 17 process.StartInfo.RedirectStandardInput = true; 18 process.StartInfo.CreateNoWindow = true; 19 process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 20 process.StartInfo.UseShellExecute = false; 21 process.StartInfo.LoadUserProfile = true; 22 process.StartInfo.StandardOutputEncoding = Encoding.UTF8; 23 24 if (cmdLine.ToLower().Contains(".bat")) 25 { 26 process.StartInfo.FileName = "cmd.exe"; 27 process.StartInfo.Arguments = "/c" + " " + cmdLine + " " + args; 28 } 29 else 30 { 31 process.StartInfo.FileName = cmdLine; 32 process.StartInfo.Arguments = args; 33 } 34 if (outputsAction != null) 35 process.OutputDataReceived += new DataReceivedEventHandler(outputsAction); 36 if (errorsAction != null) 37 process.ErrorDataReceived += new DataReceivedEventHandler(errorsAction); 38 39 process.Start(); 40 process.BeginOutputReadLine(); 41 process.BeginErrorReadLine(); 42 43 int i = 0; 44 while (!process.HasExited) 45 { 46 if (i++ > timeOut * 60 && !process.HasExited) 47 { 48 process.Kill(); 49 process.Close(); 50 throw new Exception(string.Format("Command line execution timeout.cmdLine:{0},args:{1}", cmdLine, args)); 51 } 52 Thread.Sleep(1000); 53 } 54 } 55 56 57 /// <summary> 58 /// 执行命令行 59 /// </summary> 60 /// <param name="cmdLine">程序集名称(或批处理文件)</param> 61 /// <param name="args">参数</param> 62 /// <param name="outputs">命令行输出信息</param> 63 /// <param name="errors">命令行输出错误信息</param> 64 /// <param name="timeOut">超时时间(单位:分钟)</param> 65 public static void ExecuteCommandeLine(String cmdLine, String args, out string outputs, out string errors, int timeOut = _defaultTimeOut) 66 { 67 StringBuilder outputString = new StringBuilder(); 68 StringBuilder errorString = new StringBuilder(); 69 outputs = string.Empty; 70 errors = string.Empty; 71 72 ExecuteCommandeLine(cmdLine, args, 73 (o, d) => 74 { 75 if (d.Data != null && outputString.MaxCapacity > outputString.Length + d.Data.Length + 10) 76 outputString.AppendLine(d.Data); 77 }, 78 (o, d) => 79 { 80 if (d.Data != null && errorString.MaxCapacity > errorString.Length + d.Data.Length + 10) 81 errorString.AppendLine(d.Data); 82 }, 83 timeOut); 84 outputs = outputString.ToString(); 85 errors = errorString.ToString(); 86 }