C# 編寫命令行交互工具——實時輸出_獲取執行結果

咱們在寫程序的時候一般會用到命令行工具。前端

如Ping 某個網段,寫個註冊表,啓動項,或者感謝其餘壞事。shell

在網上查了一下,多數都說用C# 作命令行交互須要作不少不少的邏輯處理。那麼今天博主也來寫一個簡單一點的。c#

首先咱們建一個CmdUtils類,而後編寫咱們須要的方法工具

那麼在開始以前,咱們先看下網上提供的方法。this



那麼開始,咱們先新建一個類,而後編寫方法命令行


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 也就是執行完畢以後不退出code

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 屬於引用數據類型,那麼笨方法就從該變量下手。orm

咱們在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);
         }
    }

那麼最後的效果圖爲

相關文章
相關標籤/搜索