如何将上下文菜单参数传递给 Java ProcessBuilder
How to pass context menu parameters to Java ProcessBuilder
我正在使用 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"
我如何将这些参数传递给流程构建器?
我已经尝试了以下方法,none 有效:
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());
"Not working" 在这种情况下意味着程序已启动,但没有任何反应(文件甚至没有打开)。
如果我按以下顺序切换它们:(程序、文件、参数),则文件会正确打开,但附加参数什么也不做,就好像它们根本不存在一样。
将这些参数转换为 ProcessBuilder 命令的正确方法是什么?
您需要做的第一件事是将 "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 ProcessBuilder 在 windows 上使用特定程序打开文件。
它本身工作正常,使用以下代码:
ProcessBuilder p = new ProcessBuilder();
p.command("C:\Program Files (x86)\...\program.exe", file.getAbsolutePath());
我想要做的是从该程序调用文件上下文菜单条目的功能,如下所示:
"C:\Program Files (x86)\...\program.exe" /Enqueue "%1"
我如何将这些参数传递给流程构建器?
我已经尝试了以下方法,none 有效:
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());
"Not working" 在这种情况下意味着程序已启动,但没有任何反应(文件甚至没有打开)。
如果我按以下顺序切换它们:(程序、文件、参数),则文件会正确打开,但附加参数什么也不做,就好像它们根本不存在一样。
将这些参数转换为 ProcessBuilder 命令的正确方法是什么?
您需要做的第一件事是将 "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
替换,这只是一个示例