如何从我的Java应用程序运行batch file?

在我的Java应用程序中,我想运行一个batch file,它调用“ scons -Q implicit-deps-changed build\file_load_type export\file_load_type

看来,我甚至不能让我的batch file执行。 我没有想法。

这是我在Java中所拥有的:

 Runtime. getRuntime(). exec("build.bat", null, new File(".")); 

以前,我有一个Python Sconscript文件,我想运行,但由于没有工作,我决定我会通过batch file调用脚本,但该方法尚未成功。

batch file不是可执行文件。 他们需要一个应用程序来运行它们(即cmd)。

在UNIX上,脚本文件在文件的开始处具有shebang(#!)以指定执行它的程序。 在Windows中双击是由Windows资源pipe理器执行的。 CreateProcess不知道任何有关的。

 Runtime. getRuntime(). exec("cmd /c start \"\" build.bat"); 

注意:使用start \"\"命令,一个单独的命令窗口将以空白标题打开,batch file的任何输出将显示在那里。 它也应该使用`cmd / c build.bat',在这种情况下,如果需要,可以从Javasubprocess中读取输出。

有时候线程执行的进程时间比JVM线程的等待进程时间要高,当你调用的进程需要一定的时间来处理的时候会发生这种情况,使用waitFor()命令如下:

 try{ Process p = Runtime.getRuntime().exec("file location here, don't forget using / instead of \\ to make it interoperable"); p.waitFor(); }catch( IOException ex ){ //Validate the case the file can't be accesed (not enought permissions) }catch( InterruptedException ex ){ //Validate the case the process is being stopped by some external situation } 

这样JVM就会停止,直到你正在调用的进程完成之后,继续执行线程执行堆栈。

 Runtime runtime = Runtime.getRuntime(); try { Process p1 = runtime.exec("cmd /c start D:\\temp\\a.bat"); InputStream is = p1.getInputStream(); int i = 0; while( (i = is.read() ) != -1) { System.out.print((char)i); } } catch(IOException ioException) { System.out.println(ioException.getMessage() ); } 

要运行batch file使用Java,如果这是你在说…

 String path="cmd /c start d:\\sample\\sample.bat"; Runtime rn=Runtime.getRuntime(); Process pr=rn.exec(path);` 

这应该做到这一点。

ProcessBuilder是运行外部进程的Java 5/6方式。

用于运行批处理脚本的可执行文件是cmd.exe ,它使用/c标志指定要运行的batch file的名称:

 Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "build.bat"}); 

理论上你也应该能够以这种方式运行Scons,尽pipe我没有testing过这个:

 Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build\file_load_type", "export\file_load_type"}); 

编辑:阿马拉,你说这是行不通的。 列出的错误是从Windows机器上的Cygwinterminal运行Java时得到的错误; 这是你在做什么? 问题在于Windows和Cygwin有不同的path,所以Windows的Java版本在Cygwinpath上找不到scons可执行文件。 如果事实certificate是你的问题,我可以进一步解释。

 Process p = Runtime.getRuntime().exec( new String[]{"cmd", "/C", "orgreg.bat"}, null, new File("D://TEST//home//libs//")); 

用jdk1.5和jdk1.6进行testing

这对我来说工作得很好,希望它也能帮助别人。 为了得到这个我挣扎了更多的日子。 🙁

我遇到过同样的问题。 但是有时CMD无法运行我的文件。 这就是为什么我在我的桌面上创build一个temp.bat,接下来这个temp.bat将运行我的文件,接下来临时文件将被删除。

我知道这是一个更大的代码,但是,即使Runtime.getRuntime()。exec()失败,我仍然为100%工作。

 // creating a string for the Userprofile (either C:\Admin or whatever) String userprofile = System.getenv("USERPROFILE"); BufferedWriter writer = null; try { //create a temporary file File logFile = new File(userprofile+"\\Desktop\\temp.bat"); writer = new BufferedWriter(new FileWriter(logFile)); // Here comes the lines for the batch file! // First line is @echo off // Next line is the directory of our file // Then we open our file in that directory and exit the cmd // To seperate each line, please use \r\n writer.write("cd %ProgramFiles(x86)%\\SOME_FOLDER \r\nstart xyz.bat \r\nexit"); } catch (Exception e) { e.printStackTrace(); } finally { try { // Close the writer regardless of what happens... writer.close(); } catch (Exception e) { } } // running our temp.bat file Runtime rt = Runtime.getRuntime(); try { Process pr = rt.exec("cmd /c start \"\" \""+userprofile+"\\Desktop\\temp.bat" ); pr.getOutputStream().close(); } catch (IOException ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); } // deleting our temp file File databl = new File(userprofile+"\\Desktop\\temp.bat"); databl.delete(); 

以下工作正常:

 String path="cmd /c start d:\\sample\\sample.bat"; Runtime rn=Runtime.getRuntime(); Process pr=rn.exec(path);