C# 编写命令行交互工具——实时输出_获取执行结果

来源:互联网 发布:淘宝里什么是旺旺号 编辑:程序博客网 时间:2024/05/16 15:42

我们在写程序的时候通常会用到命令行工具。

如Ping 某个网段,写个注册表,启动项,或者感谢其他坏事。

在网上查了一下,多数都说用C# 做命令行交互需要做很多很多的逻辑处理。那么今天博主也来写一个简单一点的。

首先我们建一个CmdUtils类,然后编写我们需要的方法

那么在开始之前,我们先看下网上提供的方法。



那么开始,我们先新建一个类,然后编写方法


 Process cmd = null;            if (cmd == null)            {                cmd = new Process();//创建进程对象                  ProcessStartInfo startInfo = new ProcessStartInfo();                startInfo.FileName = "cmd.exe";//设定需要执行的命令                  startInfo.Arguments = "/C "+shell;//“/C”表示执行完命令后马上退出                  startInfo.UseShellExecute = false;//不使用系统外壳程序启动                  startInfo.RedirectStandardInput = true;//不重定向输入                  startInfo.RedirectStandardOutput = true; //重定向输出                  startInfo.CreateNoWindow = true;//不创建窗口                  cmd.StartInfo = startInfo;               // cmd.Start();            }            if (cmd.Start())//开始进程              {                string str = cmd.StandardOutput.ReadToEnd();                cmd.Close();                cmd = null;                return str;            }            return null;

那么很明显,cmd 在执行完毕之后就被关闭了

Ok,修改一下,不加/c 也就是执行完毕之后不退出

             Process cmd = null;             if (cmd == null)             {                 cmd = new Process();//创建进程对象                   ProcessStartInfo startInfo = new ProcessStartInfo();                 startInfo.FileName = "cmd.exe";//设定需要执行的命令                   startInfo.Arguments = "";//“/C”表示执行完命令后马上退出                   startInfo.UseShellExecute = false;//不使用系统外壳程序启动                   startInfo.RedirectStandardInput = true;//不重定向输入                   startInfo.RedirectStandardOutput = true; //重定向输出                   startInfo.CreateNoWindow = true;//不创建窗口                   cmd.StartInfo = startInfo;                 // cmd.Start();             }

这样子就可以打开之后不关闭了。

下面接着写怎样将前端显示的搞到执行的来。我们都知道string 属于引用数据类型,那么笨方法就从该变量下手。

我们在CmdUtils中定义一个shell 的string 变量,并设置访问权限为public ,方便调用。

public String shell = "";

那么界面上应该怎样显示呢。


 public partial class Cmd : Form    {        public String isRun ="start";        CmdUtils cmd = new CmdUtils();        public Cmd()        {            InitializeComponent();            new Thread(new ThreadStart(init)).Start();        }        private void init() {            cmd.sendCmd(this);        }        private void sendBtn_Click(object sender, EventArgs e)        {            cmd.shell = comEdit.Text;        }        private void exitBtn_Click(object sender, EventArgs e)        {            cmd.shell = "exit";        }                  }

我们首先启动一个线程,然后通过改变shell 变量达到交互效果。

下面上CmdUtils 代码

public class CmdUtils    {         public String shell = "";         public void sendCmd(Cmd cmdoom) {             Process cmd = null;             if (cmd == null)             {                 cmd = new Process();//创建进程对象                   ProcessStartInfo startInfo = new ProcessStartInfo();                 startInfo.FileName = "cmd.exe";//设定需要执行的命令                   startInfo.Arguments = "";//“/C”表示执行完命令后马上退出                   startInfo.UseShellExecute = false;//不使用系统外壳程序启动                   startInfo.RedirectStandardInput = true;//不重定向输入                   startInfo.RedirectStandardOutput = true; //重定向输出                   startInfo.CreateNoWindow = true;//不创建窗口                   cmd.StartInfo = startInfo;                 // cmd.Start();             }             if (cmd.Start())//开始进程               {                 cmd.StandardOutput.ReadLine().Trim();                 cmd.StandardOutput.ReadLine().Trim();                 while (cmdoom.isRun.IndexOf("start") != -1) {                     if (shell.Length > 0) {                         cmd.StandardInput.WriteLine(shell);                        cmd.StandardOutput.ReadLine().Trim();                        cmd.StandardInput.WriteLine("\n");                        String log = cmd.StandardOutput.ReadLine().Trim();                        String path = log.Substring(0, 2).ToUpper();                        updateLog(cmdoom, log);                        log = "";                        do                        {                                                        String logm = cmd.StandardOutput.ReadLine().Trim();                            if (logm.IndexOf(path) != -1){                                                            break;                            }                            updateLog(cmdoom, logm+"\n");                            log+=logm;                                                    } while (true);                                                shell = "";                     }                 }                                  cmd.Close();                 cmd = null;                 return ;             }             return ;         }         private delegate void UpdateLog();         private void updateLog(Cmd cmd, String log) {             UpdateLog set = delegate()             {                 cmd.cmdLogTextArea.AppendText("\n" + log);             };             cmd.Invoke(set);         }    }

那么最后的效果图为



0 0