我正在使用一段代码来获取基于Windows系统的任务管理器的过程,以便我可以找到基于桌面的应用程序的实例是否正在运行。代码工作正常,这是我的代码。
private static void getAppInstancesCountAlreadyRunning() throws Exception {
int isApplicationRunning = 0;
String line;
Process p = Runtime.getRuntime().exec(
System.getenv("windir") + "/system32/" + "tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
while ((line = input.readLine()) != null) {
line = line.toLowerCase();
logger.info("....... line read ... "+line);
if (line.contains("AppNameHere")) {// || line.contains("javaw.exe")
logger.info("....... Already running @ " + line);
isApplicationRunning++;
}
}
input.close();
if (isApplicationRunning > 1) {
//Some code here....
}
}
问题是:我尝试了不同的系统有Windows XP和7,但在一个系统上我没有得到进程列表,我认为行
Process p = Runtime.getRuntime().exec(System.getenv("windir") + "/system32/" +
"tasklist.exe");
没有给出正确的清单可以有人说出是什么原因。
提前致谢。
答案 0 :(得分:1)
您不需要完整路径来执行此过程只需执行Process p = Runtime.getRuntime().exec("tasklist");
此外,您还需要考虑可能未安装任务列表。
答案 1 :(得分:1)
不确定原因(可能是32/64位版本问题,执行用户的权限,安全性等),但我会说有更好的方法来实现这一点。您当前的方法将与大多数Java应用程序匹配,其中许多应用程序使用javaw.exe运行。
相反,为什么不考虑在启动应用程序时将文件写入磁盘,因此额外的调用可以检查这一点。在多个操作系统中运行时,这种方法也更加友好。
答案 2 :(得分:0)
System.getenv(String path),尝试获取path的值,其中path是环境变量。如果未在env变量中定义windir,则System.getenv(String path)将无法返回任何一个。