C# 經過指定進程ID,結束進程,代碼示範與講解

今天,測試以前用C# WinForm編寫的工具時,發現緊鄰上次執行CMD DOS進程,還在後臺運行,與當前運行的進程,發生衝突,結果同時顯示在一個顯示框中,產生混淆,很不美觀。因此添加一個需求,在運行當前程序時,檢測上次運行的DOS命令,是否在運行,若是還在運行,關閉上次運行的CMD進程,再運行當前命令。shell

從網上翻閱了大佬寫的教程,發現,都是經過獲取進程名,而後在獲取當前系統運行進程列表,在列表中,作名稱匹配,發現相同的進程名,Kill掉,這顯然不能知足個人需求。更況且,CMD 在執行時,進程名都是CMD,因此決心本身編碼,實現經過進程IP,關閉指定CMD進程。工具

ProcessCmdUtils代碼示範:測試

using System;
using System.Diagnostics;

namespace HelloWorld.utils
{
   class ProcessCmdUtils
   {
		//開啓一個進程,執行傳入的CMD DOS命令
       public static Process ExecCmd()
       {
           //cmd = cmd.Trim().TrimEnd('&') + "&exit";


           Process p = null;
           try
           {
               p = new Process();
               p.StartInfo.FileName = "cmd.exe";
               p.StartInfo.UseShellExecute = false;        //是否使用操做系統shell啓動
               p.StartInfo.RedirectStandardInput = true;   //接受來自調用程序的輸入信息
               p.StartInfo.RedirectStandardOutput = true;  //由調用程序獲取輸出信息
               p.StartInfo.RedirectStandardError = true;   //重定向標準錯誤輸出
               p.StartInfo.CreateNoWindow = true;          //不顯示程序窗口
           }
           catch (Exception e)
           {
               throw;
           }

           return p;
       }

		//根據傳入的進程ID,強制結束指定進程
       public bool KillProcExec(int procId)
       {
           string cmd = string.Format("taskkill /f /t /im {0}", procId); //強制結束指定進程

           Process ps = null;
           try
           {
               ps = ExecCmd();
               ps.Start();
               ps.StandardInput.WriteLine(cmd + "&exit");
               return true;
           }
           catch
           {
               throw;
           }
           finally
           {
               ps.Close();
           }
           

           return false;
       }
   }
}

執行代碼示範(僅演示符合此教程代碼):編碼

static int psTaskID = -1; //檢測是否有上次執行的task,若是值爲-1,則執行,不然kill掉上次執行未完成任務
  
  private void button1_Click(object sender, EventArgs e)
       {
           Console.WriteLine("method ininer " + psTaskID);

			//檢測psTaskID 是否爲-1,若是不是,則執行KillProcExec()方法
           if (psTaskID != -1)
           {
               ProcessCmdUtils procKill = new ProcessCmdUtils();
               bool killStatus=procKill.KillProcExec(psTaskID);
               Console.WriteLine("try external "+psTaskID);
               if (killStatus)
               {
                   psTaskID = -1;
               }
           }

           try
           {

               string address = textBox1.Text;

               string cmd = "TRACERT.exe " + address;

               ps = ProcessCmdUtils.ExecCmd();


               ps.Start();

               psTaskID = ps.Id;//獲取運行的process ID 賦值給 paTaskID

               Console.WriteLine("try ininer "+psTaskID);

				//other code 其餘代碼,暫不演示
           }
           catch
           {
               throw;
           }
           finally
           {
               ps.Close();
           }
       }
相關文章
相關標籤/搜索