我想编写一个小型 Java 应用程序(最好是 Java 8),它可以执行以下操作:
notepad thisisatest
,则会打开一个记事本窗口,并且命令行在任务管理器中显示 notepad thisisatest
。我已经测试过 1. + 2.:
Runtime.getRuntime().exec
按照建议这里 - 它列出了notepad.exe进程及其PID,但是似乎没有也可以请求命令行信息ProcessHandle
按照建议here(Java 9+,使用Java 11进行测试)-它找到notepad.exe进程,但命令行信息(process.info().commandLine()
)为空process.command
)为空至于杀戮:
changePriority()
、stop()
,然后kill()
),但由于某种原因不起作用。Runtime.getRuntime().exec("taskkill /pid 1234 /f")
(我用jProcesses2获得了PID)可以工作,但我不能确定我正在杀死正确的进程,除非我也能以某种方式获取信息。我的问题: 1.和3.正在工作,但我如何完成2.(查找命令行信息)?
我相信你的话,因为看起来你已经深入研究了对显示命令行参数的支持。这有点老套,但对我有用,你可以得到一些想法。我的 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);
}
}