2015-12-14 95 views
0

我正在使用Java ProcessBuilder在Windows上使用特定程序打開文件。如何將上下文菜單參數傳遞給Java ProcessBuilder

本身做工精細,用下面的代碼:

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

+0

你需要對'%1'的值進行'字符串'替換以達到你想傳遞的值。你還需要將'String'分解爲一個數組,因此每個命令/參數都是一個單獨的元素。 – MadProgrammer

+0

好吧,所以程序是一個帶有隊列的媒體播放器,所以我假定%1應該是是文件名。我現在試過這個版本:p.command(「C:\\ Program Files(x86)\\ ... \\ program.exe」,\t「Enqueue」,next.getAbsolutePath());但它仍然只打開文件,沒有別的... – user3265879

回答

1

你需要做的第一件事,就是讓"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替代,在許多不同的方式,這只是一個EXA一個是

+0

好吧,這一切都很有意義,不幸的是,軟件仍然行爲不正確......但我開始認爲問題不在於代碼,而在於軟件本身。我現在注意到,直接從上下文菜單中調用命令無法正常工作......所以我認爲java代碼完全實際上下文菜單條目所做的事情(這顯然不是很多...)。我要報告這個問題,否則謝謝你的幫助! – user3265879

相關問題