bwael 2015-10-06 08:56 采纳率: 0%
浏览 3498

C#隐式运行CMD命令,并获取控制台输出

正在用C#做一个简易的使用mingw的IDE程序,使用cmd.exe中通过gcc命令进行编译链接等操作,想要及时获取 错误以及警告信息 进行输出。

开始时参照 C#程序调用cmd.exe执行命令

代码如下:

 using System.Diagnostics;
public class CmdHelper
    {
        private static string CmdPath = @"C:\Windows\System32\cmd.exe";

        /// <summary>
        /// 执行cmd命令
        /// 多命令请使用批处理命令连接符:
        /// <![CDATA[
        /// &:同时执行两个命令
        /// |:将上一个命令的输出,作为下一个命令的输入
        /// &&:当&&前的命令成功时,才执行&&后的命令
        /// ||:当||前的命令失败时,才执行||后的命令]]>
        /// 其他请百度
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="output"></param>
        public static void RunCmd(string cmd, out string output)
        {
            cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
            using (Process p = new Process())
            {
                p.StartInfo.FileName = CmdPath;
                p.StartInfo.UseShellExecute = false;        //是否使用操作系统shell启动
                p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息
                p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息
                p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出
                p.StartInfo.CreateNoWindow = true;          //不显示程序窗口
                p.Start();//启动程序

                //向cmd窗口写入命令
                p.StandardInput.WriteLine(cmd);
                p.StandardInput.AutoFlush = true;

                //获取cmd窗口的输出信息
                output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();//等待程序执行完退出进程
                p.Close();
            }
        }
    }

但是 StandardOutput.ReadToEnd(); 时常导致假死

于是采用了 StandardOutput.ReadLine();来读取控制台内容并将读取的字符串连接后输出。可行,但效率十分感人,如果是比较复杂的控制台内容造成的效果和ReadToEnd();无异。

然后 http://www.jb51.net/article/67927.htm 目测这篇文章比较可行,可是执行结果是不停新建窗口= =

求解决方案

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 10:16
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在.NET Core中,你可以使用System.Console类的WriteLine()Console.Out.Write()方法来输出到控制台。以下是一个示例:

    using System;
    using System.IO;
    using System.Linq;
    using System.Text;
    
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello, World!");
        }
    }
    

    或者如果你需要更复杂的数据结构(例如数组、字典),你可以在循环中添加数据并逐个打印出来:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    
    class Program
    {
        static void Main()
        {
            var data = new Dictionary<string, int>();
    
            for (int i = 0; i < 10; i++)
            {
                data.Add($"Key-{i}", i * 10); // 假设每个键值对都是以'Key-'开头
            }
    
            foreach (var item in data)
            {
                Console.WriteLine(item.Key + ": " + item.Value);
            }
        }
    }
    

    以上两种方式都可以让你实时地查看到命令的输出,并且不需要任何额外的操作。

    评论

报告相同问题?