2010-01-27 59 views
14

我很難在Java中執行需要參數的批處理文件。這些參數可能包含空格,所以我需要用引號包裝它們。我還需要爲Linux做同樣的事情,因爲某些參數可能包含特殊字符,如!使用參數執行

非功能的Windows代碼:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "\"mybat.bat\"", 
     "\"param 1\"", 
     "\"param 2\"", 
     "\"param 3\"" 
     );  

非功能性的Linux代碼:

ProcessBuilder pb = new ProcessBuilder(
     "bash", 
     "-c", 
     "'myshellscript.sh'", 
     "'param 1'", 
     "'param 2'", 
     "'param 3'" 
     ); 

我知道我應該加入參數,如下面的Windows示例,但是這不會與空間一起工作:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "mybat.bat param 1 param 2 param 3" 
     ); 

這應該怎麼辦?

+0

你不是引號內他們對於確切原因?你爲什麼不爲你最後的片段做這件事? – zneak 2010-01-27 02:22:05

+0

我正在努力使前兩個片段的工作。第三個片段將傳遞6個參數給mybat.bat,當我只查找三個參數時。 – 2010-01-27 02:25:11

回答

17

的Windows:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", "/c", "mybat.bat", 
     "param 1", "param 2", "param 3"); 

Unix的:

ProcessBuilder pb = new ProcessBuilder(
     "sh", "mybat.sh", 
     "param 1", "param 2", "param 3"); 
+0

我試過了,它的工作原理! – 2010-01-27 02:42:25

+1

這是爲什麼發作? java.io.IOException:java.io.IOException:sh:在java.lang.UNIXProcess找不到。 DmMdbConsumer.migrateData(DmMdbConsumer.java:328)at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)at 012. DmMdbConsumer.run(DmMdbConsumer.java:230)在java.lang.Thread.run(Thread。java:595) – 2010-01-27 13:34:40

+0

「sh」在我的情況下必須是「/ bin/sh」。謝謝! – 2010-01-27 14:33:56

5

不,你應該不是引用* nix上的參數。在交互式shell中* nix需要引用以防止shell誤解它們,但是直接啓動進程時不涉及shell。因此不需要引用。

如果您確實包含引號,則啓動的進程會將其視爲其傳入參數的一部分,並執行諸如(例如)嘗試打開包含引號的文件名。

你也不希望bash的「-c」參數。這告訴它將下一個參數解析爲一個命令行,但是您提供了一個參數列表。刪除「-c」選項和多餘的引號,它應該工作。

正確的Linux電話是:

ProcessBuilder pb = new ProcessBuilder(
    "bash", 
    "myshellscript.sh", 
    "param 1", 
    "param 2", 
    "param 3" 
    ); 

也不是,如果文件「myshellscript.sh」是可執行文件,並有適當的家當線(如「#/斌/慶典!」),你也不需要「bash」論證。這是可取的,因爲如果腳本被替換爲用不同語言編寫的腳本,則不必更新您的調用應用程序。

同樣,在Windows上,您不應該需要「cmd」和「/ c」參數。進程啓動器/ OS應該自動處理啓動批處理文件(基於擴展名)。

+0

不幸的是我需要Windows的cmd和/ c。我的shell腳本確實有shebang行,但是我無法讓它使用sh或不使用sh。 – 2010-01-27 13:36:28