2013-10-23 69 views
0

當設置本地通信程序集時,我今天遇到了這個問題。基本上我的一個應用程序正在向另一個發送一些數據,其中一部分數據是一個包含要執行的命令的字符串(就像你從命令行那樣)。比方說,例如:將預先轉義的命令行參數傳遞給ProcessBuilder

g++ foo.cc bar.cc -o foobar 

是我的第一個應用程序發送的命令。第二個接收命令(除其他之外)的應用程序需要在執行一些其他處理之後執行該命令。現在

,起初我以爲這會使用是微不足道的一個ProcessBuilder

String exampleCommand = "g++ foo.cc bar.cc -o foobar"; 
ProcessBuilder builder = new ProcessBuilder(exampleCommand); 
builder.start().waitFor(); 

然而這是哪裏出現問題。

CreateProcess error=2, The system cannot find the file specified 

好吧,別擔心,我想我不能把整個東西都轉儲到生成器中。命令的第一部分通常是一個普通的字符串,所以我想我可能會繞第一個' '分裂,以分離程序名和參數。

String exampleCommand = "g++ foo.cc bar.cc -o foobar"; 
String[] parts = exampleCommand.split(" ", 2); 
ProcessBuilder builder = new ProcessBuilder(parts[0], parts[1]); 
builder.start().waitFor(); 

這給我帶來了一點點接近,則g++文件現在可以正確地找到,但是檢查的g++stderr我認爲發生以下錯誤後:

g++.exe: error: foo.cc bar.cc -o foobar: No such file or directory 

此時我意識到ProcessBuilder類必須轉義爲準備命令行傳遞給它的所有參數(因此它通常將參數作爲單個參數的數組而不是僅僅預定義的參數字符串)的原因。

我的問題是,「是否有任何方法將參數的原始字符串傳遞給ProcessBuilder並說THERE,執行正確?

因爲命令來自另一個應用程序,並且絕不是靜態的,所以我不能將參數事先拆分成數組,並將它們正確地傳遞給ProcessBuilder構造函數。這些論點並不那麼簡單,僅僅是圍繞' '分割字符串也可以正常工作;參數可能包含用雙引號轉義的空格。例如:

g++ "..\my documents\foo.cpp" bar.cpp -o foobar 

可能是從應用和分裂來該字符串周圍' '並把它傳遞給ProcessBuilder將導致腐敗參數的命令。

如果沒有正確的方法做到這一點有人可以請我指出一個獨立的命令行參數解析器(Java),可以將命令行字符串變成有效的String[]

回答

2

好吧,我現在感覺很愚蠢,但我通過簡單地恢復到好的舊Runtime.getRuntime().exec(...)達到我想要的結果。我會留下這個問題以防萬一有人像我一樣愚蠢,並發現它很有用。

String exampleCommand = "g++ foo.cc bar.cc -o foobar"; 
Runtime sys = Runtime.getRuntime(); 
sys.exec(exampleCommand); 

簡單。

1

到調用Runtime.getRuntime()EXEC(...)解決方案註釋:。

的調用Runtime.getRuntime()EXEC(...)不好了。在OSX El Capitan上執行的java中,'Runtime.getRuntime().exec(...)'包含一個錯誤,有時會在java程序退出時關閉打開的進程。它在以前的OSX版本上工作正常。但是,ProcessBuilder適用於所有OSX版本。

(尚未發佈足夠的代表點以使其成爲正常評論。)