C#執行CMD命令並接收返回結果的實現方法

        最近工作的時候發現軟件裏面通過查詢ARP表查詢某一IP對應的ARP條目的時,概率性出現查詢到的ARP條目爲空,一開始懷疑Ping通但是沒有學習到ARP,後來想想這是不可能的,最後經過各種分析發現是軟件中調用清除ARP的操作是通過調用Kernel.dll中的WinExec實現的,這個函數只要調用成功即返回,並不會等待調用的程序執行完畢才返回,所以在某些反應遲鈍的電腦上,就會出現:如果你的操作順序是清除ARP,Ping,查詢ARP,就可能出現在Ping完後ARP表被清除掉,導致查不到ARP條目。

在網上查詢C#調用程序並等待程序執行完畢才返回的實現方法如下:

1.引入

using System.Diagnostics;  

2.創建執行CMD

Process CmdProcess = new Process();  
CmdProcess.StartInfo.FileName = "cmd.exe";    

3.配置開發方式輸入輸出錯誤

CmdProcess.StartInfo.CreateNoWindow = true;         // 不創建新窗口    
CmdProcess.StartInfo.UseShellExecute = false;       //不啓用shell啓動進程  
CmdProcess.StartInfo.RedirectStandardInput = true;  // 重定向輸入    
CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向標準輸出    
CmdProcess.StartInfo.RedirectStandardError = true;  // 重定向錯誤輸出  

4.執行cmd且獲取返回值

方法一

CmdProcess.StartInfo.Arguments = "/c " + "=====cmd命令======";//“/C”表示執行完命令後馬上退出  
CmdProcess.Start();//執行  

CmdProcess.StandardOutput.ReadToEnd();//獲取返回值  

CmdProcess.WaitForExit();//等待程序執行完退出進程  

CmdProcess.Close();//結束  

方法二

CmdProcess.StandardInput.WriteLine(str + "&exit"); //向cmd窗口發送輸入信息  
CmdProcess.StandardInput.AutoFlush = true;  //提交  

CmdProcess.Start();//執行  

CmdProcess.StandardOutput.ReadToEnd();//輸出  

CmdProcess.WaitForExit();//等待程序執行完退出進程  

CmdProcess.Close();//結束  

5.輸出返回值

首先 引入

using System.IO;

 

            StreamReader sr =CmdProcess.StandardOutput;//獲取返回值 
            string line = ""; 
            int num = 1;
            while ((line=sr.ReadLine())!=null)
            {   
                if(line!="")
                {
                    Console.WriteLine(line + " " + num++);
                }
            }

6.Process 的 HasExited屬性

    //等待程序執行完退出進程
    CmdProcess.WaitForExit();

    //判斷程序是退出了進程 退出爲true(上面的退出方法執行完後,HasExited的返回值爲 true) 
     falg = CmdProcess.HasExited; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章