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

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

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

那么最后的效果图为



  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值