2011-11-02 208 views
4

I'm使用Mac OS獅子,用java版本的exec()1.6.0_26Java命令調用Runtime.getRuntime()。在Mac OS中

我正在做一個小的應用程序的Mac在Java中有一個主菜單對於用戶來說,他可以選擇幾個選項。

其中之一是使用的.pkg

一切工作正常使用這些命令安裝應用程序:

File instFolder = new File(System.getProperty("user.dir") + "/foldername/appInstaller.pkg"); 
String s = "open "+ instFolder.toString(); 
Process p = Runtime.getRuntime().exec(s); 

然後我意識到有問題時,文件夾名稱中有空格,或者如果我複製這個帶有所需子文件夾的java文件以「NO NAME」作爲名稱(或帶空格的某個名稱)作爲USB筆驅動器。

由於S1將成爲類似:

開/卷/ NO NAME/FOLDERNAME/appInstaller.pkg

開/用戶/用戶1 /桌面/文件夾名稱/ appInstaller.pkg



所以,當你運行該p過程中,該命令將完成,其中第一空間的路徑上出現

開/卷/ NO

開/用戶/用戶1 /桌面/文件夾


要嘗試解決這個問題,我改變了的定義這樣的事情:

String s = "open "+ "\"" + instFolder.toString() + "\""; 

它停止工作正常。奇怪的是,如果我複製的價值(創建變量s後),並粘貼在終端它的工作原理:

開「/用戶/用戶1 /桌面/文件夾名稱/ appInstaller.pkg」


但從Java運行它不起作用。

請問您能幫我嗎?

謝謝。

回答

5

爲了正確逃生的論點,你可以使用以下內容:

Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() }); 

雖然我可能會用更現代的ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString()); 
Process p = pb.start(); 
int exitCode = p.waitFor(); 

雖然this可能是值得依賴於要與流程的輸出做一讀。

注:編輯,以反映在評論問題

+0

嗨@ beny23:謝謝你的建議。他們都很好,但我有一個問題。假設instFolder是錯誤的,所以當我嘗試運行安裝程序時,進程將返回一個exitcode <> 0,所以我可以知道發生了錯誤。我如何檢查與流程建設者? – user897013

1

看起來你的路徑在轉換成shell時沒有引號。

你或許應該加上「'」你的路的兩側,所以最終shell命令看起來像:

open 'your path' 

,而不是

open your path 
+0

Hi @Nicolas:
這是我修改s variableString s =「open」+「\」「+ instFolder.toString()+」\「」的定義時所要做的。 – user897013

+0

無論如何你的答案。 – user897013

0

下面是從上述問題的答案就出來了一個小竅門:

ProcessBuilder pb = new ProcessBuilder(commandString.split(" ")); 

commandString = "killall Mail"然後,將分離將分離的話使其成爲一個String[]參數到ProcessBuilder

相關問題