• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yxchun

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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;

图片

 

posted on 2022-07-29 17:10  yxchun  阅读(1694)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3