首页 新闻 会员 周边

C#怎么调用cmd.exe实现手动输入调试命令

-1
悬赏园豆:50 [待解决问题]

各位:

    最近使用C#和C混合变成,编写了一个windows应用程序。为了便于查看程序内部信息,打算在界面上点击一个按钮,触发调用cmd。在cmd窗口手动输入命令后,界面解析命令,进而调用不同的C函数,并将函数的printf结果输出到cmd窗口中。
    现在遇到点问题,通过Process调用cmd之后,窗口内不能输入,请问是怎么回事。Process调用cmd命令如下:
        private string RunCmd()
        {
            //例Process
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";           //确定程序名
            p.StartInfo.UseShellExecute = false;        //Shell的使用
            p.StartInfo.RedirectStandardInput = true;   //重定向输入
            p.StartInfo.RedirectStandardOutput = true; //重定向输出
            p.StartInfo.CreateNoWindow = false;          //设置显示窗口

            p.Start();
            p.StandardInput.WriteLine();
            return p.StandardOutput.ReadToEnd();
        }

    请问C#怎么调用cmd.exe并实现输入命令功能,谢谢。

milestone_2010的主页 milestone_2010 | 初学一级 | 园豆:152
提问于:2016-04-29 19:40
< >
分享
所有回答(3)
1
string str = Console.ReadLine();

            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            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(str + "&exit");

            p.StandardInput.AutoFlush = true;
            //p.StandardInput.WriteLine("exit");
            //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
            //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令



            //获取cmd窗口的输出信息
            string output = p.StandardOutput.ReadToEnd();

            //StreamReader reader = p.StandardOutput;
            //string line=reader.ReadLine();
            //while (!reader.EndOfStream)
            //{
            //    str += line + "  ";
            //    line = reader.ReadLine();
            //}

            p.WaitForExit();//等待程序执行完退出进程
            p.Close();


            Console.WriteLine(output);

 

刘宏玺 | 园豆:14020 (专家六级) | 2016-04-29 20:51

大侠你好:我这个是windows应用程序,string str = Console.ReadLine();以及Console.WriteLine(output); 好像没有作用,请帮忙看看原因,谢谢。

支持(0) 反对(0) milestone_2010 | 园豆:152 (初学一级) | 2016-05-03 09:44

@milestone_2010: 原理都一样啊,就是输入输出换了而已

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-05-03 10:35

@刘宏玺: 因为是windows应用程序,不是控制台应用程序,所以无法直接使用Console.ReadLine()。通过下面的方法可以解决,其实我还有一个问题想问,如果console能使用,干吗还要用process再起一个cmd.exe,这两个功能不是一样的吗?

     [DllImport("kernel32.dll")]
        public static extern bool AllocConsole();

        [DllImport("kernel32.dll")]
        public static extern bool FreeConsole();

        private void RunCmd()
        {
            AllocConsole();
            Console.WriteLine("Please Input the debug command!");

            bool Flag = true;

            while (Flag)
            {
                string strnew = Console.ReadLine();

                if ("AB" == strnew)
                {
                    FUN_AB();
                }
                else if ("CD" == strnew)
                {
                    FUN_CD();
                }
                else if ("exit" == strnew)
                {
                    MediaApi.ClassMediaApi.Md_NewDebugTestExit();
                    break;
                }
                else
                {
                    FUN_ERROR();
                }
            }
            FreeConsole();
        }

支持(0) 反对(0) milestone_2010 | 园豆:152 (初学一级) | 2016-05-03 14:24

@milestone_2010: 控制台应用程序又不是cmd.exe,当然要用process再起一个

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-05-03 14:29
0

输入重定向

jello chen | 园豆:7306 (大侠五级) | 2016-04-29 22:19

您好:能解释的更清楚点吗,谢谢

支持(0) 反对(0) milestone_2010 | 园豆:152 (初学一级) | 2016-05-03 09:44
0

这样试试

public void WriteConsole(string msg)
{
    const int WM_CHAR = 0x102;
    if (consoleHandle == IntPtr.Zero)
        consoleHandle = FindWindow("ConsoleWindowClass", consoleTitle);
    foreach (var b in Encoding.ASCII.GetBytes(msg))
    {
        SendMessage(consoleHandle.ToInt32(), WM_CHAR, b, 0);
    }
    SendMessage(consoleHandle.ToInt32(), WM_CHAR, 0x0d, 0);//回车ASCII码为0x0d

}

 

yuankaiwsl | 园豆:206 (菜鸟二级) | 2016-06-16 16:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册