gpt4 book ai didi

java - 如何将上下文菜单参数传递给 Java ProcessBuilder

转载 作者:行者123 更新时间:2023-12-01 10:44:14 26 4
gpt4 key购买 nike

我正在使用 Java ProcessBuilder 在 Windows 上使用特定程序打开文件。

使用以下代码,它本身就可以正常工作:

ProcessBuilder p = new ProcessBuilder();
p.command("C:\\Program Files (x86)\\...\\program.exe", file.getAbsolutePath());

我想要做的是从该程序调用文件上下文菜单条目的功能,如下所示:

"C:\Program Files (x86)\...\program.exe" /Enqueue "%1"

我如何将这些参数传递给流程构建器?

我已经尝试过以下方法,但都不起作用:

p.command("C:\\Program Files (x86)\\...\\program.exe","/Enqueue","%1",next.getAbsolutePath());
p.command("C:\\Program Files (x86)\\...\\program.exe","Enqueue","%1",next.getAbsolutePath());
p.command("C:\\Program Files (x86)\\...\\program.exe","Enqueue","\"%1\"",next.getAbsolutePath());
p.command("C:\\Program Files (x86)\\...\\program.exe","/Enqueue","\"%1\"",next.getAbsolutePath());

在这种情况下,“不工作”意味着程序已启动,但没有任何反应(文件甚至没有打开)。

如果我按以下顺序切换它们:(程序、文件、参数),则文件会正确打开,但附加参数不会执行任何操作,就好像它们根本不存在一样。

将这些参数转换为 ProcessBuilder 命令的正确方法是什么?

最佳答案

您需要做的第一件事是 make "C:\Program Files (x86)\...\program.exe" /Enqueue "%1"进入 [C:\Program Files (x86)\...\program.exe, /Enqueue, %1] 的数组否则ProcessBuilder将尝试执行整个String作为单个命令,这确实不是您想要的。

也许像...

String cmd = "\"C:\\Program Files (x86)\\...\\program.exe\" /Enqueue \"%1\"";
StringBuilder sb = new StringBuilder(cmd);
List<String> commands = new ArrayList<>(10);
while (sb.length() > 0) {
if (sb.charAt(0) == '"') {
int nextIndex = sb.indexOf("\"", 1);
if (nextIndex < 0) {
nextIndex = sb.length();
} else {
nextIndex++;
}
commands.add(sb.substring(1, nextIndex).replace("\"", ""));
sb.delete(0, nextIndex);
} else if (sb.charAt(0) == ' ') {
if (sb.length() > 1 && sb.charAt(1) != '"') {
int nextIndex = sb.indexOf(" ", 1);
if (nextIndex < 0) {
nextIndex = sb.length();
}
commands.add(sb.substring(1, nextIndex));
sb.delete(0, nextIndex);
} else {
sb.delete(0, 1);
}
}
}
System.out.println(commands);

这将打印...

[C:\Program Files (x86)\...\program.exe, /Enqueue, %1]

您可能可以使用一个非常简洁的正则表达式来帮助解决此问题,但这或多或少可以完成工作。

接下来,您要替换 %1与您要打开的文件。现在,您可以在之前的代码中执行此操作,这会更有效,但出于演示目的...

String[] parameters = {"Hello kitty"};
for (int index = 0; index < commands.size(); index++) {
String value = commands.get(index);
if (value.startsWith("%")) {
int parameter = Integer.parseInt(value.substring(1)) - 1;
if (parameter < parameters.length) {
commands.set(index, parameters[parameter]);
}
// You might want to think about what you want to do if you have
// more parameter marks then you do have actual parameter values
}
}
System.out.println(commands);

打印出...

[C:\Program Files (x86)\...\program.exe, /Enqueue, Hello kitty]

您现在可以将其传递给 ProcessBuilder ,例如...

ProcessBuilder pb = new ProcessBuilder(commands);

现在,您可以执行 String在代码中的许多不同点以多种不同的方式进行替换,这只是一个示例

关于java - 如何将上下文菜单参数传递给 Java ProcessBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34278719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com