在C#winform应用程序上显示cmd命令

时间:2015-01-28 10:13:56

标签: c# devenv

我需要编写一个小实用程序来重建解决方案。我使用下面的代码来做同样的事情。

        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);
            }
        }

如果您将在命令提示符下观察,那么您可以看到执行输出,但同样的事情没有反映在列表框中。

请帮助解决此问题。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将输出重定向到临时文件,然后可以读取文件,如 -

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
            }
        }

答案 1 :(得分:0)

您可以执行异步:

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();
}