2012-09-16 9 views
8

Używam programu java w systemie Windows, który zbiera dziennik ze zdarzeń systemu Windows. Tworzony jest plik .csv, na którym należy wykonać określone operacje.Java: czekać na proces exec, aż wyjdzie

Polecenia są wykonywane i wyprowadzane. Jak mogę spowodować, że mój program Java zaczeka, aż proces się zakończy?

Oto fragment kodu używam:

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

Alternatywnie można rozważyć użycie Commons exec: http://commons.apache.org/exec/tutorial .html –

Odpowiedz

12

Trzeba użyć waitFor() zamiast wait(). W ten sposób wątek zostanie zablokowany do momentu zakończenia wykonywanego polecenia.

+0

Nie jest to rozwiązanie, o którym wspomniałem powyżej, że waitfor() nie działa w komentarzach. Gdyby zadziałało, to nie byłoby problemu. – user1631171

1

To zadziała. Jeśli nie, należy określić, co dokładnie nie działa

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

Właściwie próbowałem tego. Plik CSV ma być podany jako wynik polecenia, ale reszta kodu rozpoczyna wykonywanie przed utworzeniem pliku CSV. Wierzę, że może to być spowodowane rurą używaną w poleceniu. – user1631171

+0

To rodzaj stanu wyścigowego. Nie można polegać na tworzeniu plików w buforowanych buforowanych systemach plików. Jeśli twój następny kod opiera się na tym pliku, możesz albo zachować go w pamięci, albo odpytować system plików. (Linux ma do wyboru/epoll) – tuergeist

+0

Tak, wprowadziłem tymczasową poprawkę poprzez sondowanie, jeśli plik został utworzony. I tak, istnieje warunek wyścigu podczas tworzenia pliku. – user1631171

4

Znalazłem odpowiedź tutaj 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(); 
    } 
}