检查一些exe程序是否在Windows上运行

时间:2013-09-25 12:50:11

标签: java process exe

如何在Windows上检查某个.exe程序是否正在运行(正在进行中)?

我正在制作更新一个.exe程序的java应用程序。因此,如果某个客户端使用该exe程序,我的应用程序会要求关闭exe程序,并在关闭后自动替换新的.exe文件。

4 个答案:

答案 0 :(得分:34)

您可以在java程序中运行以下语句。在此之前,您需要知道task manager中任务的名称。假设你想看MS-Word正在运行。然后运行MS-Word,转到任务管理器,在进程选项卡下,您应该看到名为word.exe的进程。找出您要定位的流程的名称。完成后,您只需运行以下代码:

String line;
String pidInfo ="";

Process p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");

BufferedReader input =  new BufferedReader(new InputStreamReader(p.getInputStream()));

while ((line = input.readLine()) != null) {
    pidInfo+=line; 
}

input.close();

if(pidInfo.contains("your process name"))
{
    // do what you want
}

答案 1 :(得分:3)

您可以尝试运行以下代码:

Runtime rt = Runtime.getRuntime();

并执行“tasklist”

任务列表返回当前正在执行的进程列表(如任务管理器的进程选项卡中所示)。

答案 2 :(得分:2)

以下是检查应用程序是否在Windows系统上运行的完整代码:

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class ApplicationUtilities
{
    public static void runApplication(String applicationFilePath) throws IOException, InterruptedException
    {
        File application = new File(applicationFilePath);
        String applicationName = application.getName();

        if (!isProcessRunning(applicationName))
        {
            Desktop.getDesktop().open(application);
        }
    }

    // http://stackoverflow.com/a/19005828/3764804
    private static boolean isProcessRunning(String processName) throws IOException, InterruptedException
    {
        ProcessBuilder processBuilder = new ProcessBuilder("tasklist.exe");
        Process process = processBuilder.start();
        String tasksList = toString(process.getInputStream());

        return tasksList.contains(processName);
    }

    // http://stackoverflow.com/a/5445161/3764804
    private static String toString(InputStream inputStream)
    {
        Scanner scanner = new Scanner(inputStream, "UTF-8").useDelimiter("\\A");
        String string = scanner.hasNext() ? scanner.next() : "";
        scanner.close();

        return string;
    }
}

例如,您可以使用runApplication()方法仅在应用程序尚未运行时运行该应用程序:

ApplicationUtilities.runApplication("C:\\Program Files (x86)\\WinSCP\\WinSCP.exe");

同样的原则适用于删除可执行文件。

答案 3 :(得分:0)

这只是对Java 9 或更高版本的用户的建议。
甚至与操作系统无关:

Interface ProcessHandle
static Stream<ProcessHandle>    allProcesses​()

更多详细信息,请访问:
https://docs.oracle.com/javase/9/docs/api/java/lang/ProcessHandle.html