2013-06-18 24 views
0

我正在使用一段代码来获取基于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"); 

不给正确的列表可以有人告诉是什么原因。

在此先感谢。

回答

1

你不需要完整的路径来运行这个过程只是做Process p = Runtime.getRuntime().exec("tasklist");

您还需要考虑到任务列表可能未安装。

+0

是的,这是我刚才在两个系统上检查过的同一个问题,你能否给出一些问题的解决方案? – NoNaMe

+0

您是否检查系统中是否存在任务列表进程?如果是的话,也许你的Java应用程序没有权限运行这个过程...尝试以管理员身份运行 – fmodos

+0

不,我只是检查了罪魁祸首系统中的任务列表进程,它不在那里,我已经检查了版权问题,用户有管理员在该系统的权利,肯定这是任务列表过程的问题,因为它不存在。任何帮助? – NoNaMe

0

System.getenv(String path)尝试获取path的值,其中path是环境变量。如果windir没有在env变量之间定义,System.getenv(String path)将无法返回anythwing。

+0

让我检查这个东西,但是如果它和你说的一样,那么它的解决方案是什么? – NoNaMe

+0

我只是检查环境变量和变量已经设置在那里,这意味着这不是问题,fmodos的答案是更多的电击,因为该实用程序未安装在罪魁祸首系统。谢谢你的回答 – NoNaMe

1

不确定的原因(可能是32/64位版本的问题,执行用户的权限,安全等),但我会说有更好的方法来实现这一点。您目前的方法将与大多数java应用程序相匹配,其中许多应用程序使用javaw.exe运行。

相反,为什么不考虑在启动应用程序时将文件写入磁盘,所以额外的调用可以检查这一点。当涉及到在多个操作系统中运行时,这种方法也更加友好。

+0

感谢您的好主意,将尝试实施它。 +1的想法:) – NoNaMe