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 }