微信扫一扫

028-83195727 , 15928970361
business@forhy.com

Java获取Windows系统指定软件进程号及启动软件

windows,java,软件2016-11-04

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/53009445

1 背景

本文主要说明Java获取Windows系统指定软件进程号及启动软件的方法。不过在说明之前,先回顾下Windows的cmd命令行中如何查看进程信息及启动软件。

这里以启动SQL Server客户端为例说明,打开cmd命令窗口,执行下列命令:

# 查看Ssms.exe的进程信息
tasklist /fi "imagename eq Ssms.exe" /fo list

# 启动Ssms.exe,下列地址为SQL Server客户端安装路径
D:\BusinessSoftWares\SqlServer2008\sharex86\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe

如下图:

2 Java实现

Java实现分为2步:

  • 第一步,查看指定软件进程信息,并提取进程PID存进List数组;
  • 第二步,若没有检测到软件进程,则启动软件。

2.1 第一步,查看指定软件进程信息,并提取进程PID存进List数组

其实主要就是将这个命令“tasklist /fi “imagename eq Ssms.exe” /fo list”通过Java来执行,其中只需将“Ssms.exe”换成自己想要检测得软件名即可。

/**
 * Created by loongshaw 2016/11/2.
 *
 * NOTE 进程编号查询
 * 
 * para cmd=tasklist /fi "imagename eq Ssms.exe" /fo list
 */
public class ProcessSearchServiceImpl implements ProcessSearchService {

    private static final Logger logger = Logger.getLogger(ProcessSearchServiceImpl.class);

    public List<String> search(String cmd) {

        BufferedReader bufferedReader = null;
        List<String> list = new ArrayList<String>();

        try{
            Process process = Runtime.getRuntime().exec(cmd);
            System.out.println(cmd);
            logger.debug(cmd);

            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String str;
            while ((str = bufferedReader.readLine()) != null){

                if (str.startsWith(Constant.START_STRING)){
                    String[] array = str.split(":");
                    String pid = array[1].trim();

                    list.add(pid);
                }
                logger.debug(str);
            }
            logger.info(list);

        }catch (IOException e){
            logger.debug(e.toString());
        }finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                logger.debug(e.toString());
            }
        }

        return list;
    }
}

输出信息:

2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - Windows CMD:tasklist /fi "imagename eq Ssms.exe" /fo list
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - 
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - 映像名称:     Ssms.exe
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - PID:          210324
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - 会话名      : Console
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - 会话#   :     1
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [DEBUG] - 内存使用 :    68,152 K
2016-11-04-14-23 [main] [com.amap.axf.data.single.service.impl.ProcessSearchServiceImpl] [INFO] - PID list:[210324]

2.2 第二步,若没有检测到软件进程,则启动软件。

对第一步进程检测返回的List数组进行判断,若为空则执行软件启动方法。

/**
 * Created by loongshawn on 2016/11/2.
 * 
 * NOTE 启动软件
 * 
 * para name="Ssms.exe",替换为自己想要启动的软件名
 */
public class ProgramLauchServiceImpl implements ProgramLauchService {

    public String launch(String name) {

        String exception = "";

        try {
            Runtime.getRuntime().exec(name);

        }catch (IOException e){
            exception = e.toString();
        }

        return exception;
    }
}