在 C# winform 应用程序上显示 cmd 命令
Posted
技术标签:
【中文标题】在 C# winform 应用程序上显示 cmd 命令【英文标题】:Show cmd commands on C# winform Application 【发布时间】:2015-01-28 10:13:56 【问题描述】:我需要编写一个小实用程序来重建解决方案。我正在使用下面的代码来做同样的事情。
string solutionFile = @"E:\Projects\TFS\Code\WebSite.sln";
string cmd1 = @"""C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86" + " &devenv " + "\"" + solutionFile + "\"" + " /rebuild release";
cmd1 = "\"" + cmd1 + "\"";
String command = String.Format("0 1", @"/k ", cmd1);
ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe")
UseShellExecute = false,
RedirectStandardOutput = true
;
cmdsi.Arguments = command;
using (Process cmd = Process.Start(cmdsi))
using (StreamReader reader = cmd.StandardOutput)
string result = reader.ReadToEnd();
listBox1.Items.Add(result);
如果您将在命令提示符中观察,那么您可以看到执行输出,但相同的内容没有反映在列表框中。
请帮忙解决这个问题。
提前谢谢你。
【问题讨论】:
我记得以前做过这个,但是我不记得遇到过这样的问题。也就是说,您是否尝试过在主线程上调用“listBox1.Items.Add”?这可能是线程相关的问题。 由于主线程不会立即显示结果,但在执行完成后会显示输出。但它只显示一个空格(“”)。我已经拒绝了这个link 尝试简化cmd1
,让它运行一个基本的批处理文件,将一行文本回显到控制台,看看是否可行。这应该将问题缩小到您显示的代码或您正在调用的批处理文件。
如果您在控制台窗口上看到输出,那么您知道它没有被重定向。您没有重定向 StandardError,这是一个错误。最好的方法是让 cmd.exe 完全处理重定向,重定向到一个文件。避免棘手的死锁问题。示例代码is here.
【参考方案1】:
您可以将输出重定向到一个临时文件,然后可以像这样读取该文件-
string cmd1 = "help > e:/temp.txt"; //e:/temp.txt is temporary file where the output is redirected.
String command = String.Format("0 1", @"/k ", cmd1);
ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe")
//You don't need to read console outputstream
//UseShellExecute = false,
//RedirectStandardOutput = true
;
cmdsi.Arguments = command;
using (Process cmd = Process.Start(cmdsi))
//Check if file exist or you can wait till the solution builds completely. you can apply your logic to wait here.
if (File.Exists("E:/temp.txt"))
//Read the files here
string[] lines = File.ReadAllLines("E:/temp.txt");
//Do your work here
【讨论】:
【参考方案2】:您可以异步执行:
string solutionFile = @"E:\Projects\TFS\Code\WebSite.sln";
string batFile = @"C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat";
string args = "x86" + " &devenv " + "\"" + solutionFile + "\"" + " /rebuild release";
ProcessStartInfo cmdsi = new ProcessStartInfo(batFile)
Arguments = args,
UseShellExecute = false,
RedirectStandardOutput = true
;
using (Process cmd = new Process())
cmd.StartInfo = cmdsi;
cmd.OutputDataReceived += (sender, args) => listBox1.Items.Add(string.IsNullOrEmpty(args.Data) ? string.Empty : args.Data);
cmd.Start();
【讨论】:
如果 bat 文件无法启动,请按照您的操作通过 cmd 进程运行它。以上是关于在 C# winform 应用程序上显示 cmd 命令的主要内容,如果未能解决你的问题,请参考以下文章