2017-10-18 109 views
0

好吧,所以要刪除一個Perfoce標籤,CommandLine命令是:p4 label -d mylabel123。 現在我想用Java來執行這個命令。我試過Runtime.exec(),它的作用像魅力。但是,當我使用ProcessBuilder運行相同的命令時,它不起作用。任何幫助讚賞。爲什麼Java Runtime.exec命令正常工作,但ProcessBuilder無法執行Perforce客戶端命令?

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Main { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     exec1("p4 label -d mylabel123"); 
     exec2("p4","label -d mylabel123"); 
    } 
    public static void exec1(String cmd) 
      throws java.io.IOException, InterruptedException { 
     System.out.println("Executing Runtime.exec()"); 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(cmd); 

     BufferedReader stdInput = new BufferedReader(new InputStreamReader(
       proc.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(
       proc.getErrorStream())); 

     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 
     proc.waitFor(); 
    } 
    public static void exec2(String... cmd) throws IOException, InterruptedException{ 
     System.out.println("\n\nExecuting ProcessBuilder.start()"); 
     ProcessBuilder pb = new ProcessBuilder(); 
     pb.inheritIO(); 
     pb.command(cmd); 
     Process process = pb.start(); 
     process.waitFor(); 
    } 
} 

方法exec1()輸出:標籤mylabel123刪除。

方法exec2()輸出:未知命令。試試'p4 help'獲取信息。

回答

3

ProcessBuilder希望您提供命令名稱和每個參數作爲單獨的字符串。當(間接地)執行

pb.command("p4", "label -d mylabel123"); 

要構建運行命令p4帶一個參數,label -d mylabel123的處理。你想,而不是與三個獨立的參數運行該命令:

pb.command("p4", "label", "-d", "mylabel123"); 

您的線索本來,在第二種情況下,錯誤消息是由p4命令發出的(它說:「試試‘P4的幫助’的信息」 )。顯然,問題在於爭論。但是,我同意你的意見,p4確實會通過調用它的一個參數「命令」而造成一些混淆。

相關問題