2012-09-16 16 views
8

Estoy ejecutando un programa de Java en Windows que recopila el registro de eventos de Windows. Se crea un archivo .csv en el que se realizarán ciertas operaciones.Java: espere el proceso de ejecución hasta que salga

Los comandos se ejecutan y se canalizan. ¿Cómo puedo hacer que mi programa Java espere hasta que finalice el proceso?

Aquí es el fragmento de código que estoy utilizando:

Runtime commandPrompt = Runtime.getRuntime(); 
try {   
    Process powershell = commandPrompt.exec("powershell -Command \"get-winevent -FilterHashTable @{ logname = 'Microsoft-Windows-PrintService/Operational';StartTime = '"+givenDate+" 12:00:01 AM'; EndTime = '"+beforeDay+" 23:59:59 '; ID = 307 ;} | ConvertTo-csv| Out-file "+ file +"\""); 
//I have tried waitFor() here but that does not seem to work, required command is executed but is still blocked 
} catch (IOException e) { } 
// Remaining code should get executed only after above is completed. 
+1

alternativa, se puede considerar el uso de los Comunes-exec: http://commons.apache.org/exec/tutorial .html –

Respuesta

12

Es necesario utilizar waitFor() en lugar de wait(). De esa forma, su hilo se bloqueará hasta que el comando ejecutado finalice.

+0

No, esa no es la solución que he mencionado anteriormente que waitfor() no funciona en los comentarios. Si funcionó, entonces no habría ningún problema – user1631171

1

Esto funcionará. Si no es así, especifique qué es exactamente no funciona

Runtime commandPrompt = Runtime.getRuntime(); 
try {   
    Process powershell = commandPrompt.exec("powershell -Command \"get-winevent -FilterHashTable @{ logname = 'Microsoft-Windows-PrintService/Operational';StartTime = '"+givenDate+" 12:00:01 AM'; EndTime = '"+beforeDay+" 23:59:59 '; ID = 307 ;} | ConvertTo-csv| Out-file "+ file +"\""); 
    powershell.waitFor(); 
} catch (IOException e) { } 
// remaining code 
+0

En realidad lo he intentado. El comando debe dar un archivo CSV como salida, pero el resto del código comienza a ejecutarse antes de que se cree el CSV. Creo que esto puede deberse a la tubería utilizada en el comando. – user1631171

+0

Es una especie de condición de carrera. No puede confiar en la creación de archivos en sistemas de archivos almacenados en caché. Si su próximo código se basa en este archivo, puede guardarlo en la memoria o sondear el sistema de archivos. (Linux tiene select/epoll para eso) – tuergeist

+0

Sí, realicé una solución temporal al sondear si se creó un archivo. Y sí, hay una condición de carrera cuando se está creando el archivo. – user1631171

4

he encontrado la respuesta aquí Run shell script from Java Synchronously

public static void executeScript(String script) { 
    try { 
     ProcessBuilder pb = new ProcessBuilder(script); 
     Process p = pb.start(); // Start the process. 
     p.waitFor(); // Wait for the process to finish. 
     System.out.println("Script executed successfully"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
Cuestiones relacionadas