java runtime.exec

java - Runtime.exec(). WaitFor() no espera hasta que se complete el proceso



(4)

Tengo este codigo

File file = new File(path + "//RunFromCode.bat"); file.createNewFile(); PrintWriter writer = new PrintWriter(file, "UTF-8"); for (int i = 0; i <= MAX; i++) { writer.println("@cd " + i); writer.println(NATIVE SYSTEM COMMANDS); // more things } writer.close(); Process p = Runtime.getRuntime().exec("cmd /c start " + path + "//RunFromCode.bat"); p.waitFor(); file.delete();

Lo que pasa es que el archivo borrado antes de ejecutarse realmente.

¿Esto se debe a que el archivo .bat solo contiene una llamada al sistema nativo? ¿Cómo puedo hacer la eliminación después de la ejecución del archivo .bat ? (No sé cuál será la salida del archivo .bat , ya que cambia dinámicamente).


Al usar start , le está pidiendo a cmd.exe que inicie el archivo por lotes en segundo plano:

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "//RunFromCode.bat");

Por lo tanto, el proceso que inicie desde Java ( cmd.exe ) vuelve antes de que finalice el proceso en segundo plano.

Elimine el comando de start para ejecutar el archivo por lotes en primer plano; luego, waitFor() esperará a que se complete el archivo por lotes:

Process p = Runtime.getRuntime().exec("cmd /c " + path + "//RunFromCode.bat");

Según OP, es importante tener disponible la ventana de la consola; esto se puede hacer agregando el parámetro /wait , como lo sugiere @Noofiz. El siguiente SSCCE trabajó para mí:

public class Command { public static void main(String[] args) throws java.io.IOException, InterruptedException { String path = "C://Users//andreas"; Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "//RunFromCode.bat"); System.out.println("Waiting for batch file ..."); p.waitFor(); System.out.println("Batch file done."); } }

Si RunFromCode.bat ejecuta el comando EXIT , la ventana de comandos se cierra automáticamente. De lo contrario, la ventana de comandos permanecerá abierta hasta que la cierre explícitamente con EXIT : el proceso java está esperando hasta que la ventana se cierre en cualquier caso.


Intente agregar /wait parámetro delante del comando de start .


Ninguno de los códigos descritos en la marca de comentario como respuesta es una solución.

Primera respuesta

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "//RunFromCode.bat");

Segunda respuesta

Process p = Runtime.getRuntime().exec("cmd /c " + path + "//RunFromCode.bat");

Tercera respuesta

public class Command { public static void main(String[] args) throws java.io.IOException, InterruptedException { String path = "C://Users//andreas"; Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "//RunFromCode.bat"); System.out.println("Waiting for batch file ..."); p.waitFor(); System.out.println("Batch file done."); } }