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.");
}
}
waitForProcessOutput()
Hizo el truco para nosotros.
Ver:
Ejemplo de código (usado en SOAPUI)
def process = "java -jar ext//selenese-runner.jar".execute()
process.waitForProcessOutput()
def exitValue = process.exitValue()