2012-03-23 182 views
8

另一個問題很快就會出現,但這必須是一個非常明顯的錯誤,我沒有看到。我已經編寫了一些代碼來運行下面的批處理文件,但是我收到一條錯誤消息,說它找不到該文件,但我可以向您保證該文件存在於目錄中!ProcessBuilder無法找到文件?

public class Pull { 

public void pullData() throws IOException { 
    ProcessBuilder pb = new ProcessBuilder("adb.bat"); 
    File f = new File("C:\\"); 
    pb.directory(f); 
    Process p = pb.start(); 
} 

public static void main(String[] args) throws IOException { 
    Pull pull = new Pull(); 
    pull.pullData(); 
} 

}

,這裏是錯誤消息

Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified 
+0

所以,adb.bat是在C:\,對不對?嘗試將其放置在項目文件夾 – keyser 2012-03-23 22:37:32

+0

中或其副本不在其中。我正確使用processbuilder嗎? – Rookie 2012-03-23 22:47:10

+0

您是否嘗試將批處理文件的內容作爲參數傳入到您的'ProcessBuilder'中?例如,如果「adb.bat」執行了類似「java -version」的操作,你是否嘗試過使用新的ProcessBuilder(「java」,「 - server」)?我想知道,如果Java正在嘗試像處理可執行文件一樣對待adb.bat,即使它實際上只是一個基於文本的腳本。 – CodeBlind 2012-03-23 22:58:56

回答

11

我運行Linux,但是當我運行的代碼(修正運行.SH,而不是出現了同樣的錯誤。蝙蝠)。

嘗試:

ProcessBuilder pb = new ProcessBuilder("c:\\adb.bat"); 

顯然使用ProcessBuilder.directory不影響工作目錄(用於發現可執行的目的)構建的建設者時選擇(至少,這就是似乎文件說它會改變工作目錄,所以我猜輸入/輸出文件可能是相對於那個?)

我不確定它在內部實際做什麼,但提供了可執行文件的路徑構造函數修復了這個問題。

此帖子talks about the problem and this solution,但也會引發是否需要設置環境變量,其中類似「路徑」的變量可能有助於ProcessBuilder發現可執行文件。

2

嗨嘗試使用這裏的教程 - http://www.javabeat.net/examples/2007/08/21/using-the-new-process-builder-class/。使用它我已經改變了你的班級,它找到了文件(注意,我不知道里面有什麼,所以不能完全測試它)。它編譯和運行沒有問題,而你自己的我遇到同樣的問題,你:

public class Pull { 


public void pullData() throws IOException { 
    /*ProcessBuilder pb = new ProcessBuilder("adb.bat"); 
    File f = new File("C:\\"); 
    pb.directory(f); 
    Process p = pb.start(); 
    */ 
    ProcessBuilder p = new ProcessBuilder("C:\\adb.bat"); 
    p.start(); 
    System.out.println(p.toString()); 
} 


public static void main(String[] args) throws IOException { 


    Pull pull = new Pull(); 
    pull.pullData(); 

} 


}