获取当前运行的Win 10进程的命令行信息

问题描述 投票:0回答:1

我想编写一个小型 Java 应用程序(最好是 Java 8),它可以执行以下操作:

  1. 列出当前在 Windows 10 中运行的所有进程并找到特定进程(名称和 PID,同一应用程序可以有多个正在运行的实例!),例如记事本.exe
  2. 阅读此进程的命令行,例如如果您在命令提示符中使用
    notepad thisisatest
    ,则会打开一个记事本窗口,并且命令行在任务管理器中显示
    notepad thisisatest
  3. 如果此信息包含特定内容,那么我想终止该进程。

我已经测试过 1. + 2.:

  • Runtime.getRuntime().exec
    按照建议这里 - 它列出了notepad.exe进程及其PID,但是似乎没有也可以请求命令行信息
  • ProcessHandle
    按照建议here(Java 9+,使用Java 11进行测试)-它找到notepad.exe进程,但命令行信息(
    process.info().commandLine()
    )为空
  • jProcesses2(Java 8,github),建议第一个版本here - 这找到了正确的进程,但信息(
    process.command
    )为空

至于杀戮:

  • jProcesses2 在 github 页面上提供了一个示例(
    changePriority()
    stop()
    ,然后
    kill()
    ),但由于某种原因不起作用。
  • Runtime.getRuntime().exec("taskkill /pid 1234 /f")
    (我用jProcesses2获得了PID)可以工作,但我不能确定我正在杀死正确的进程,除非我也能以某种方式获取信息。

我的问题: 1.和3.正在工作,但我如何完成2.(查找命令行信息)?

java windows process
1个回答
0
投票

我相信你的话,因为看起来你已经深入研究了对显示命令行参数的支持。这有点老套,但对我有用,你可以得到一些想法。我的 Powershell 版本没有控制 CSV 引用的选项,但更高版本有 (q.v.)

import java.nio.file.*;
import java.util.*;
import java.util.stream.*;
import java.io.*;

public class WinProcessExplorer {
    public static void main(String[] args) throws Exception {
        record ProcInfo (String processId, String processName, String commandLine) {
            public ProcInfo(String[] tokens) {
                this(tokens[0],tokens[1],tokens[2]);
            }
        }
        final List<String> COMMAND = List.of(
                "powershell.exe",
                "Get-CimInstance",
                "-ClassName",
                "Win32_Process",
                "|",
                "Select-Object",
                "ProcessId,ProcessName,CommandLine",
                "|",
                "ConvertTo-Csv",
                "-Delimiter",
                "`t"
                );
        List<ProcInfo> allProcessInfo = new ArrayList<>();
        Process p = new ProcessBuilder(COMMAND).redirectError(Path.of(System.getProperty("java.io.tmpdir"), "process-explorer-err.log").toFile()).start();
        try (Scanner s = new Scanner(p.getInputStream())) {
            while (s.hasNextLine()) {
                String[] tokens = s.nextLine().split("\t");
                if (tokens.length == 3) {
                    allProcessInfo.add(new ProcInfo(tokens));
                }
            }
        }
        allProcessInfo.forEach(System.out::println);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.