2011-06-22 15 views
6

En mi programa Java, se crea un proceso que se ejecuta un comando para ejecutar un archivo por lotes como esto:Ejecución de un comando de Java y Esperando el comando termine

try { 
     File tempFile = new File("C:/Users/Public/temp.cmd"); 
     tempFile.createNewFile(); 
     tempFile.deleteOnExit(); 


     setContents(tempFile, recipe.getText()); //Writes some user input to file 
     String cmd = "cmd /c start " + tempFile.getPath(); 


     Process p = Runtime.getRuntime().exec(cmd); 


     int exitVal = p.waitFor(); 

     refreshActionPerformed(evt); 

    } catch (InterruptedException ex) { 
     Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Ahora, lo que me gustaría que suceda es que el comando

refreshActionPerformed(evt); 

sólo se ejecuta después de que el archivo por lotes que se llama ha terminado de ejecutarse. Pero ahora mismo, se ejecuta inmediatamente después de que se abre el Símbolo del sistema.

¿cómo puedo solucionar esto?

+0

Asegúrese de leer y poner en práctica * todos * los consejos de [Cuando Runtime.exec() no] (http://www.javaworld.com/javaworld/jw-12-2000/jw- 1229-traps.html). De lo contrario, casi seguramente experimentarás el "no quiero". También considere usar un 'ProcessBuilder' para 1.5+ y pasar los argumentos como una matriz. –

+0

Leo cuando Runtime.exec() no lo hará, pero francamente, soy completamente nuevo en la programación de Java y no tengo idea de cómo implementar los consejos de ese artículo. –

Respuesta

12

Me las arreglé para encontrar la respuesta en otro lugar. Para mantener el proceso inicial abierta hasta el archivo por lotes terminado todo lo que necesita es "/ espera"

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat"); 
int exitVal = p.waitFor(); 
+2

Para mí '/ wait' y 'p.waitFor()' funcionó. –

2

llamada "cmd/c start" hace que cmd se desactive en otra instancia y salga inmediatamente. Prueba a sacar el comando "comenzar".

+0

Cuando hago esto, mi programa se congela. Mi suposición es que p.waitfor() no regresa ahora. ¿Que debería hacer? –

+0

¿podría poner una "salida" al final de su archivo .bat? –

+0

Eso parece funcionar. Pero mi problema es que los contenidos del archivo .bat están definidos por el usuario. Entonces, si no ponen una EXIT al final, están un poco atornillados. ¿Algún consejo? –

0

La respuesta dada es correcta. Agregué que la ventana abierta por el código debe cerrarse manualmente.

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat"); 
int exitVal = p.waitFor(); 
Cuestiones relacionadas