C#一键显示及杀死占用端口号进程
参照园友freeliver54代码而做的,再根据需求做的,菜鸟一只有问题尽管提出来
----------------------------------------------------------------------
1 private void t_btn_kill_Click(object sender, EventArgs e) 2 { 3 int port; 4 bool b = int.TryParse(t_txt_guardport.Text, out port); 5 if (!b) 6 { 7 MessageBox.Show("请输入正确的监听端口"); 8 return; 9 } 10 Process p = new Process(); 11 p.StartInfo.FileName = "cmd.exe"; 12 p.StartInfo.UseShellExecute = false; 13 p.StartInfo.RedirectStandardError = true; 14 p.StartInfo.RedirectStandardInput = true; 15 p.StartInfo.RedirectStandardOutput = true; 16 p.StartInfo.CreateNoWindow = true; 17 List<int> list_pid = GetPidByPort(p, port); 18 if (list_pid.Count == 0) 19 { 20 MessageBox.Show("操作完成"); 21 return; 22 } 23 List<string> list_process = GetProcessNameByPid(p, list_pid); 24 StringBuilder sb = new StringBuilder(); 25 sb.AppendLine("占用" + port + "端口的进程有:"); 26 foreach (var item in list_process) 27 { 28 sb.Append(item + "\r\n"); 29 } 30 sb.AppendLine("是否要结束这些进程?"); 31 32 if (MessageBox.Show(sb.ToString(), "系统提示", MessageBoxButtons.YesNo) == DialogResult.No) 33 return; 34 PidKill(p, list_pid); 35 MessageBox.Show("操作完成"); 36 37 } 38 39 private static void PidKill(Process p, List<int> list_pid) 40 { 41 p.Start(); 42 foreach (var item in list_pid) 43 { 44 p.StandardInput.WriteLine("taskkill /pid " + item + " /f"); 45 p.StandardInput.WriteLine("exit"); 46 } 47 p.Close(); 48 } 49 50 private static List<int> GetPidByPort(Process p, int port) 51 { 52 int result; 53 bool b = true; 54 p.Start(); 55 p.StandardInput.WriteLine(string.Format("netstat -ano|find \"{0}\"", port)); 56 p.StandardInput.WriteLine("exit"); 57 StreamReader reader = p.StandardOutput; 58 string strLine = reader.ReadLine(); 59 List<int> list_pid = new List<int>(); 60 while (!reader.EndOfStream) 61 { 62 strLine = strLine.Trim(); 63 if (strLine.Length > 0 && ((strLine.Contains("TCP") || strLine.Contains("UDP")))) 64 { 65 Regex r = new Regex(@"\s+"); 66 string[] strArr = r.Split(strLine); 67 if (strArr.Length >= 4) 68 { 69 b = int.TryParse(strArr[3], out result); 70 if (b && !list_pid.Contains(result)) 71 list_pid.Add(result); 72 } 73 } 74 strLine = reader.ReadLine(); 75 } 76 p.WaitForExit(); 77 reader.Close(); 78 p.Close(); 79 return list_pid; 80 } 81 82 private static List<string> GetProcessNameByPid(Process p, List<int> list_pid) 83 { 84 p.Start(); 85 List<string> list_process = new List<string>(); 86 foreach (var pid in list_pid) 87 { 88 p.StandardInput.WriteLine(string.Format("tasklist |find \"{0}\"", pid)); 89 p.StandardInput.WriteLine("exit"); 90 StreamReader reader = p.StandardOutput;//截取输出流 91 string strLine = reader.ReadLine();//每次读取一行 92 93 while (!reader.EndOfStream) 94 { 95 strLine = strLine.Trim(); 96 if (strLine.Length > 0 && ((strLine.Contains(".exe")))) 97 { 98 Regex r = new Regex(@"\s+"); 99 string[] strArr = r.Split(strLine); 100 if (strArr.Length > 0) 101 { 102 list_process.Add(strArr[0]); 103 } 104 } 105 strLine = reader.ReadLine(); 106 } 107 p.WaitForExit(); 108 reader.Close(); 109 } 110 p.Close(); 111 112 return list_process; 113 }