2013-04-12 19 views
4

我有一個的ProcessBuilder:的ProcessBuilder不能與多個參數的正確行爲

String src = c:/hello/ 
String dst = c:/hello/2 

ProcessBuilder builder = null; 
builder = new ProcessBuilder("c:/file/file.exe", "-i", src, "-f", "-l 500", dst); 
builder.redirectErrorStream(true); 
process = builder.start(); 

的問題是,一旦我添加"-l 500"我得到的輸出:

「L 500」 無效的命令

即使我輸入了"-l 500"而不是"l 500"。如果我輸入"--l 500"我得到:

「-l 500」無效的命令

即使-l 500在命令提示符下運行時,它是一個有效的命令。

如果我刪除"-l 500"它再次工作。

我使用Processbuilder是否錯誤?

編輯:

好它好像它的工作原理,如果我做 「-l」 和 「500」 作爲獨立的條目是這樣的:

new ProcessBuilder("c:/file/file.exe", "-i", src, "-f", "-l", "500", dst); 

爲什麼會這樣呢?我不能將空間作爲同一條目嗎?

回答

4

當您在命令提示符處運行它時,不會將-l 500用引號括起來,因此它們被視爲兩個不同的參數。在命令行中輸入以下內容:

的file.exe -i some_source -f「-l 500」 some_dest

,我希望你會看到相同的錯誤消息,您認爲在使用ProcessBuilder不正確。 file.exe程序必須解析命令行,搜索具有前導字符-的字符串。當它找到單個字符串"-l 500"時,它將刪除-,並且不會將l 500識別爲有效參數。

ProcessBuilder的參數類似於命令行上的引用參數。

+0

確實聽起來很合理。但是,我怎麼輸入呢? – Omid

+0

@Omid,就像你已經作爲兩個獨立的參數來處理'ProcessBuilder'一樣? – hmjd

+0

不,我希望它成爲一個參數:-l 500 – Omid

2

我遇到了與ffmpeg命令相同的問題,其中我有許多具有值的參數。我最終創建了一個ArrayList,並將每個項目逐個添加到列表中。這裏有一個例子:

List<String> command = new ArrayList<>(); 
command.add(ffmpegCommand); 
command.add("-re"); 
command.add("-i"); 
command.add(videoFile); 
command.add("-vcodec"); 
command.add("libx264"); 
command.add("-vcodec"); 
command.add("libx264"); 
command.add("-vb"); 
command.add("500000"); 
command.add("-g"); 
command.add("60"); 
command.add("-vprofile"); 
command.add("main"); 
command.add("-acodec"); 
command.add("aac"); 
command.add("-ab"); 
command.add("128000"); 
command.add("-ar"); 
command.add("48000"); 
command.add("-ac"); 
command.add("2"); 
command.add("-vbsf"); 
command.add("h264_mp4toannexb"); 
command.add("-strict"); 
command.add("experimental"); 
command.add("-f"); 
command.add("mpegts"); 
command.add("udp://127.0.0.1:10000?pkt_size=1316"); 

ProcessBuilder pb = new ProcessBuilder(command); 
pb.redirectErrorStream(true); 
Process process; 
try { 
    process = pb.start(); 
    process.waitFor(); 
    if (process.exitValue() == 0) { 
    // success 
    } else { 
    // failure 
    } 
} catch (IOException | InterruptedException e) { 
    // handle exception 
} 

哪裏ffmpegCommand是完整路徑命令videoFile是視頻的完整路徑。這是我能夠讓命令成功運行的唯一方法。