java 利用tasklist命令,根据进程名称找到PID,并杀死进程
完整代码
package other; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class KillProcessTest { public static void main(String[] args) throws Exception { /* * 下面先是获取进程列表 */ Runtime runtime = Runtime.getRuntime(); List tasklist = new ArrayList(); try { Process process = runtime.exec("tasklist"); // 获取控制台输出 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(),"utf-8")); String s = ""; while ((s = br.readLine()) != null) {
// 去掉第一行的空行 if ("".equals(s)) { continue; } tasklist.add(s+" "); } // 获取每列最长的长度 String maxRow = tasklist.get(1) + ""; //根据空格截取tasklist中双横线,并且每个maxCol[],都表明了每一个进程的镜像名称、pid、会话名、会话#、内存使用的字符串最长长度 String[] maxCol = maxRow.split(" "); // 定义映像名称数组 String[] taskName = new String[tasklist.size()]; // 定义 PID数组 String[] taskPid = new String[tasklist.size()]; // 会话名数组 String[] taskSessionName = new String[tasklist.size()]; // 会话#数组 String[] taskSession = new String[tasklist.size()]; // 内存使用 数组 String[] taskNec = new String[tasklist.size()]; // 循环tasklist for (int i = 0; i < tasklist.size(); i++) { //取出每一行的tasklist值,比如:System 4 Services 0 2,652 K String data = tasklist.get(i) + ""; // 循环每一列,从 0-5 for (int j = 0; j < maxCol.length; j++) { switch (j) { case 0: //这里存取的值包含空格 taskName[i]=data.substring(0, maxCol[j].length()+1); //截取data,便于下一case取值 data=data.substring(maxCol[j].length()+1); // System.out.println("data="+data); break; case 1: taskPid[i]=data.substring(0, maxCol[j].length()+1); System.out.println("taskPid="+taskPid[i]+" \t"+taskPid[i].length()); data=data.substring(maxCol[j].length()+1); break; case 2: taskSessionName[i]=data.substring(0, maxCol[j].length()+1); data=data.substring(maxCol[j].length()+1); break; case 3: taskSession[i]=data.substring(0, maxCol[j].length()+1); data=data.substring(maxCol[j].length()+1); break; case 4: taskNec[i]=data; break; } } } for (int i = 0; i < taskName.length; i++) { //打印进程列表 //System.out.println(taskName[i]+" "+taskPid[i]+" "+taskSessionName[i]+" "+taskSession[i]+" "+taskNec[i]); //根据进程名称找到PID,杀掉notepad.exe if(taskName[i].contains("notepad.exe")) { //杀死进程 Runtime.getRuntime().exec("taskkill /F /PID "+taskPid[i]); System.out.println(taskPid[i]); } } } catch (Exception e) { e.printStackTrace(); } } }
解析:
1、
// 获取每列最长的长度 String maxRow = tasklist.get(1) + "";
指的是获取双横线的最长长度,每一个进程的每一个打印不会超过双横线
2、
//根据空格截取tasklist中双横线,并且每个maxCol[],都表明了每一个进程的镜像名称、pid、会话名、会话#、内存使用的字符串最长长度 String[] maxCol = maxRow.split(" ");
每一个字符串数组里面存储的是每一个双横线,总共是5个
3、定义5个字符串数组,用于存储 镜像名称、pid、会话名、会话#、内存使用
// 定义映像名称数组 String[] taskName = new String[tasklist.size()]; // 定义 PID数组 String[] taskPid = new String[tasklist.size()]; // 会话名数组 String[] taskSessionName = new String[tasklist.size()]; // 会话#数组 String[] taskSession = new String[tasklist.size()]; // 内存使用 数组 String[] taskNec = new String[tasklist.size()];
4、
从每一行中读到data后,进行截取,截取的长度是maxCol[j].length()+1; “maxCol[j].length()+1;”是指计算的双横线的长度,也就是镜像名称最大的长度,同样地case 1-4中maxCol[j].length()+1 取的是pid、会话名、会话#、内存使用的字符串最大长度;这样data.substring(0,maxCol[j].length()+1);就能截取到每一个值;
data=data.substring(maxCol[j].length()+1);是指每一列数据,减去已经取到的镜像名称,这样剩余case利用data.substring(0,maxCol[j].length()+1);就能取到值
例如:data= 13272 Services 0 30,672 K
data= Services 0 30,672 K
data= 0 30,672 K
data= 30,672 K
case 0: //这里存取的值包含空格 taskName[i]=data.substring(0,maxCol[j].length()+1); //截取data,便于下一case取值 data=data.substring(maxCol[j].length()+1); break;
图片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)