C#调用cmd执行命令获取返回结果
来源:互联网 发布:e商盟软件 编辑:程序博客网 时间:2024/06/07 10:16
最近在开发一个编译工具,调用GCC工具链和Makefile来实现编译整个工程,遇到了一个小问题,在此记录下。
具体代码如下:
public String shell = "";
public bool sendCmd(MainForm cmdoom) { Process cmd = null; if (cmd == null) { cmd = new Process();//创建进程对象 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "cmd.exe";//设定需要执行的命令 startInfo.Arguments = "";//“/C”表示执行完命令后马上退出 startInfo.UseShellExecute = false;//不使用系统外壳程序启动 startInfo.RedirectStandardInput = true;//不重定向输入 startInfo.RedirectStandardOutput = true; //重定向输出 startInfo.CreateNoWindow = true;//不创建窗口 cmd.StartInfo = startInfo; } try { if (cmd.Start())//开始进程 { cmd.StandardOutput.ReadLine().Trim(); cmd.StandardOutput.ReadLine().Trim(); while (cmdoom.isRun.IndexOf("start") != -1) { if (shell.Length > 0) { cmd.StandardInput.WriteLine(shell); cmd.StandardOutput.ReadLine().Trim(); cmd.StandardInput.WriteLine("\n"); String log = cmd.StandardOutput.ReadLine().Trim(); log = log.Substring(log.IndexOf("make"), log.Length - (log.IndexOf("make")+5)); String path = log.Substring(0, 2).ToUpper(); updateLog(cmdoom, log + "\n"); log = ""; do { String logm = cmd.StandardOutput.ReadLine().Trim(); if (logm.Trim() == "") { updateLog(cmdoom, ""); break; } updateLog(cmdoom, logm + "\n"); log += logm; } while (true); shell = ""; } } cmd.Close(); cmd = null; return true; } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("cmd" + ex.ToString()); } return true; }
通过以上代码,可以完美实现在编译的过程中,updatelog实时显示编译的信息到文本框中,但是,有个不足之处在于,编译过程中的警告或出错信息并不会显示到上面来,这样,我们就不知道代码的编译究竟有没有问题了,怎么办才好了呢?
通过了解cmd重定向这方面,得知我们当前重定向得到的是标准输出,而警告和错误信息并不属于标准输出,所以我们在上面的代码中,可以看到在调试输出窗口可以显示警告或错误信息,而在我们的文本框中却没法显示,解决方法就是,将标准错误重定向为标准输出就可以了,具体为将上面的第27行的代码改为
cmd.StandardInput.WriteLine(shell + " 2>&1 ");
阅读全文