当前位置: 首页 > 知识库问答 >
问题:

如何使用Java在Windows中运行的进程的PID

酆勇
2023-03-14

我已经使用了可用的OSHI库,但是getProcessID函数不起作用。我需要找到用户输入的进程的PID。

共有1个答案

颛孙品
2023-03-14

我不知道OSHI库,但您可以使用下面的方法来获取PID。

阅读代码中的注释:

/**
 * ** FOR WINDOWS ONLY **<br><br>
 * <p>
 * Retrieves the PID value(s) for all instances of the supplied process that
 * is running and returns them within a comma (,) delimited String.<br><br>
 * <p>
 * Note: Some applications like MS WORD (winword.exe) for example will not
 * report multiple instances of itself. This is because when you open
 * another MS WORD what you are really doing is simply opening another MAIN
 * WINDOW of MS WORD which is an integral part of the initial MS WORD opened
 * first, it's not another process. So, in other words, if MS WORD is
 * already running and you start another instance of it what happens is that
 * the application first looks to see if it is already running and if it is
 * then it just opens another Main Window giving the impression that it is
 * another process. If MS WORD is not running already then a new process is
 * started. Many different types of applications can do this sort of
 * thing.<br><br>
 *
 * @param processName      (String) Supply the executable name, for example:
 *                         "winword.exe". Will work also if only "winword" or 
 *                         "Notepad" is supplied (as examples).<br>
 *
 * @param ignoreLetterCase (Optional - Boolean - Default is true) If set to
 *                         true the this method will ignore letter Case when
 *                         trying to located the desired process.<br>
 *
 * @return (String) The PID as String for the supplied application or process 
 * name. If there is more than one instance of the application or process then 
 * a comma delimited string string will be returned consisting of a PID for each 
 * instance. It will be up to you to determine which PID belongs to which instance.
 */
public static String getProcessPID(String processName, boolean... ignoreLetterCase) {
    String pid = "";
    boolean ignoreCase = true;
    if (ignoreLetterCase.length > 0) {
        ignoreCase = ignoreLetterCase[0];
    }

    // Acquire the Task List from Windows
    ProcessBuilder processBuilder = new ProcessBuilder("tasklist.exe");
    Process process;
    try {
        process = processBuilder.start();
    }
    catch (java.io.IOException ex) {
        return "";
    }
    // Read the list and grab the desired PID
    String tasksList;
    try (Scanner scanner = new Scanner(process.getInputStream(), "UTF-8").useDelimiter("\\A")) {
        int counter = 0;
        String strg = "";
        while (scanner.hasNextLine()) {
            strg = scanner.nextLine();
            
            // Uncomment the line below to print the current Tasks List to Console Window.
            // System.out.println(strg); 
            
            if (!strg.isEmpty()) {
                counter++;
                if (counter > 2) {
                    if (ignoreCase) {
                        if (strg.toLowerCase().contains(processName.toLowerCase())) {
                            String[] tmpSplit = strg.split("\\s+");
                            pid += (pid.isEmpty()) ? tmpSplit[1] : ", " + tmpSplit[1];
                        }
                    }
                    else {
                        if (strg.contains(processName)) {
                            String[] tmpSplit = strg.split("\\s+");
                            pid += (pid.isEmpty()) ? tmpSplit[1] : ", " + tmpSplit[1];
                        }
                    }
                }
            }
        }
    }
    return pid;
}
 类似资料:
  • 问题内容: 我想在Windows中杀死特定的Java进程,例如在Linux中(获取processid然后杀死该进程)。 问题答案: 您可以使用JRE中包含的实用程序来查找Java进程的进程ID。输出将显示可执行JAR文件的名称或主类的名称。 然后使用Windows任务管理器终止该过程。如果要在命令行上执行此操作,请使用

  • 问题内容: 我有一个批处理文件,可在Windows 2003服务器中启动Java进程。根据安全策略,如果用户在特定时间段内处于非活动状态,则该计算机的用户将被强制注销。问题在于,当用户注销时,该过程也会终止。 我安排了一个新任务(“控制面板”->“计划任务”),并选择了“计算机启动时”选项,并在那里提供了用户帐户详细信息。但这似乎没有任何效果,用户仍然注销并且该进程终止。是否需要重新启动才能使此更

  • 如何在将GUI保持为活动状态而不是Hibernate/等待状态的同时延迟进程或创建队列?

  • 问题内容: 我目前正在JAVA中构建一个应用程序,其中只能执行一次。因此,我当前正在使用一个锁定文件,在其中写入当前执行的PID。 因此,只要此应用程序启动,它将打开文件(如果存在)并尝试检测写入文件的PID是否正在实际运行。 这样可以防止我的应用在解锁文件之前崩溃的问题。 我需要它在Windows(XP,7或8)和linux(所有用户都在基于debian的发行版)上工作。 这是一些代码,可以让您

  • 问题内容: 我编写了一个Java程序,该程序使用Google Analytic API检索到目前为止的Google数据并将其导出为CSV文件。我希望该程序每天运行,以便CSV文件中的数据是最新的。我该如何实现? 问题答案: 您可以使用Windows Task Scheduler(请参阅教程)来启动任何程序。对于Java,您可能需要创建一个批处理文件来运行Java程序,然后使用Scheduler运行

  • 问题内容: 我正在尝试从Windows中的命令行执行Java程序。这是我的代码: 我不确定如何执行程序-有帮助吗?在Windows上可以吗?为什么它不同于另一个环境(我以为JVM只写一次,可以在任何地方运行)? 问题答案: 假设你的文件位于 运行命令提示符 这使C:\ mywork成为当前目录。 这将显示目录内容。你应该在文件中看到。 这告诉系统在哪里可以找到JDK程序。 这将运行编译器。除了下一