2013-08-07 75 views
1

我需要從我的Java程序啓動第二個Java進程,並且分叉進程的參數之一需要包含文字雙引號字符(") 。我如何以便攜的方式來做到這一點,即至少可以在Linux和Windows上工作?如何使用包含雙引號的參數從Java啓動進程


我試圖用一個ProcessBuilder(將其引入是爲了克服Runtime類的問題,是嗎?)與字符串作爲命令行的陣列,但仍然存在與包含報價參數的一個問題:

List<String> commandLine = new ArrayList<String>(); 
commandLine.add(new File(System.getProperty("java.home") + "/bin/java").getAbsolutePath()); 
commandLine.addAll(Arrays.asList("-jar", "plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar", "-application", "org.eclipse.equinox.p2.director", "-repository", "http://download.eclipse.org/releases/juno")); 
commandLine.add("-list"); 
commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")"); 

new ProcessBuilder().command(commandLine).directory(eclipseInstallationDir).start().waitFor(); 

上面的代碼不工作(在Windows上),因爲ProcessBuilder(或別的東西)吃了在最後一個參數的雙引號:

相反的Q:select(x | x.id == "org.eclipse.sdk.ide")中,進程收到參數Q:select(x | x.id == org.eclipse.sdk.ide),然後失敗。


我想通了,我可以把它用在參數添加\"工作在Windows上,我需要一個"

commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")".replace("\"", "\\\"")); 

但這打破Linux上的調用(如莫爾加諾確認) 。所以我不得不再次檢測操作系統。是否真的沒有簡單的,可移植的方式來啓動Java中的一個進程,其參數恰好是字符串數組的內容?

+0

您的代碼適合我 – morgano

+0

哪一個?有或沒有替換的那個?並在哪個操作系統? – oberlies

+0

第一個(帶字符串「」的問題:select(x | x.id == \「org.eclipse.sdk.ide \」)「') – morgano

回答

1

正常情況下,命令參數字符串被分隔空間以形成參數數組。但是,如果您希望單個參數包含空格,則可以將該參數包含在引號中。之後,每個的引號將從字符串中移除。這不是刪除這些引號的java - 它是這樣做的操作系統本身。您可以通過提供1234\" \"5678來破解這個問題;這將最終成爲兩個參數:12345678)。然後ProcessBuilder將所有參數連接成一個命令,並傳遞給操作系統。稍後,操作系統將命令字符串按空格和引號分隔(如上所述),然後在開始新過程之前從每個字符串參數中刪除所有引號對。爲了避免引用(即將其視爲OS分析器不處理的常規字符),請在其之前使用反斜槓字符。這是Linux和Windows的命令行轉義字符。這看起來像:\\\"

+0

爲什麼會出現「更進一步」?我有一個完全不需要任何魔法的參數列表。爲什麼'ProcessBuilder'不能簡單地將它們傳遞給其他進程呢?另外,我懷疑這一切都發生在Windows上(請參閱[this comment](http://stackoverflow.com/posts/comments/26496861?noredirect = 1)) – oberlies

+0

「更進一步」是操作系統本身。 ProcessBuilder正在創建一個新的進程,就像在命令提示符窗口中手動執行一樣。它只是傳遞你給操作系統的參數。 –

+0

您提供的答案僅適用於Windows。在Linux中,如果傳遞'\「參數,那麼傳遞的就是'\」',因爲參數作爲char數組列表傳遞給操作系統,然後作爲char數組列表傳遞給操作系統,字符數組列表,不進行處理。在Windows上,事情是不同的,這是JDK的錯,它不會抽象出這種差異,因此無論哪種情況,行爲都是相同的。 –

相關問題