¿Cómo ejecuto un archivo por lotes desde mi aplicación Java?

En mi aplicación Java, quiero ejecutar un archivo por lotes que llame a ” scons -Q implicit-deps-changed build\file_load_type export\file_load_type

Parece que ni siquiera puedo ejecutar mi archivo por lotes. Estoy sin ideas.

Esto es lo que tengo en Java:

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

Anteriormente, tenía un archivo Python Sconscript que quería ejecutar, pero como eso no funcionaba, decidí llamar al script a través de un archivo por lotes, pero ese método no ha tenido éxito hasta el momento.

Los archivos por lotes no son ejecutables. Necesitan una aplicación para ejecutarlos (es decir, cmd).

En UNIX, el archivo de script tiene shebang (#!) Al comienzo de un archivo para especificar el progtwig que lo ejecuta. El Explorador de Windows realiza un doble clic en Windows. CreateProcess no sabe nada al respecto.

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

Nota: con el comando start \"\" , se abrirá una ventana de comando separada con un título en blanco y se mostrará allí cualquier resultado del archivo por lotes. También debería funcionar con `cmd / c build.bat ‘, en cuyo caso la salida se puede leer desde el subproceso en Java, si se desea.

A veces, el tiempo del proceso de ejecución de subprocesos es mayor que el tiempo de proceso de espera de subprocesos de JVM, suele suceder cuando el proceso que invoca tarda un poco en procesarse, use el comando waitFor () de la siguiente manera:

 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 } 

De esta forma, la JVM se detendrá hasta que el proceso que invoca se realice antes de continuar con la stack de ejecución de subprocesos.

 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() ); } 

Para ejecutar archivos por lotes usando Java si de eso se trata …

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

Esto debería hacerlo.

ProcessBuilder es la forma de Java 5/6 para ejecutar procesos externos.

El archivo ejecutable utilizado para ejecutar scripts por lotes es cmd.exe que utiliza el cmd.exe /c para especificar el nombre del archivo de proceso por lotes que se ejecutará:

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

Teóricamente, también debería poder ejecutar Scons de esta manera, aunque no he probado esto:

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

EDITAR: Amara, dices que esto no está funcionando. El error que enumeró es el error que obtendría al ejecutar Java desde un terminal Cygwin en un cuadro de Windows; es esto lo que estás haciendo? El problema con eso es que Windows y Cygwin tienen diferentes rutas, por lo que la versión de Windows de Java no encontrará el ejecutable scons en su ruta Cygwin. Puedo explicar más si este es tu problema.

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

probado con jdk1.5 y jdk1.6

Esto estaba funcionando bien para mí, espero que ayude a otros también. para conseguir esto, he luchado más días. 🙁

Tuve el mismo problema. Sin embargo, a veces CMD no pudo ejecutar mis archivos. Es por eso que creo un temp.bat en mi escritorio, luego este temp.bat va a ejecutar mi archivo, y luego se eliminará el archivo temporal.

Sé que este es un código más grande, pero funcionó para mí en un 100% cuando incluso Runtime.getRuntime () .exec () falló.

 // 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(); 

Lo siguiente está funcionando bien:

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

Este código ejecutará dos comandos.bat que existen en la ruta C: carpeta / carpetas.

 Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat"); 

Para expandir el índice de @ Isha, puede hacer lo siguiente para obtener el resultado devuelto (post-facto, no en tiempo real) del script que se ejecutó:

 try { Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat"); System.out.println(process.getText()); } catch(IOException e) { e.printStackTrace(); }