簡體   English   中英

如何將上下文菜單參數傳遞給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"

如何將這些參數傳遞給流程生成器?

我已經嘗試了以下方法,但沒有一個起作用:

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命令的正確方法是什么?

您需要做的第一件事是使"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替換,采用許多不同的方式,這只是其中一個示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM