如何从我的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);