1. 程式人生 > >C# 編寫命令列互動工具——實時輸出_獲取執行結果

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

那麼最後的效果圖為