您的位置:首页 > 编程语言 > C#

C#调用cmd执行命令获取返回结果

2017-12-24 19:37 776 查看
最近在开发一个编译工具,调用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 ");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: