2012-03-23 97 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(); 

} 


}