在 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 命令的主要内容,如果未能解决你的问题,请参考以下文章

C# Winform如何打开指定的文件夹?

C#系统服务的问题。WINFORM程序。

C# winform 循环动态添加了10个按钮

c# winform中的字体问题?

C# 管理员身份运行程序

wpf程序调用cmd命令行的方法(C#语言调用C++写的程序)?