2012-09-16 18 views
8

से बाहर निकलता है मैं विंडोज़ में जावा प्रोग्राम चला रहा हूं जो विंडोज घटनाओं से लॉग एकत्र करता है। एक .csv फ़ाइल बनाई गई है जिस पर कुछ संचालन किए जाने हैं।जावा: निष्पादन प्रक्रिया के लिए प्रतीक्षा करें जब तक यह

आदेश execed और पाइप हैं। प्रक्रिया समाप्त होने तक मैं अपने जावा प्रोग्राम का इंतजार कैसे कर सकता हूं?

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

वैकल्पिक रूप से आप कॉमन्स-कार्यकारी उपयोग करने पर विचार कर सकते हैं पाया काम नहीं करता: http://commons.apache.org/exec/tutorial .html –

उत्तर

12

आप waitFor() बजाय wait() उपयोग करने की आवश्यकता:

यहाँ कोड का टुकड़ा मैं उपयोग कर रहा हूँ है। इस तरह आपका धागा निष्पादित आदेश समाप्त होने तक अवरुद्ध होगा।

+0

कोई ऐसा समाधान नहीं है जिसका मैंने ऊपर उल्लेख किया है कि waitfor() टिप्पणियों में काम नहीं करता है। यदि यह काम करता है तो – user1631171

1

यह काम करेगा। यदि नहीं, तो निर्दिष्ट वास्तव में क्या

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

वास्तव में कोई समस्या नहीं होगी मैंने वास्तव में यह कोशिश की है। एक सीएसवी फ़ाइल को कमांड द्वारा आउटपुट के रूप में दिया जाना है लेकिन सीएसवी बनने से पहले शेष कोड निष्पादित करना शुरू कर देता है। मेरा मानना ​​है कि यह आदेश में इस्तेमाल पाइप की वजह से हो सकता है। – user1631171

+0

यह एक दौड़ की स्थिति है। आप buffered कैश्ड फ़ाइल सिस्टम पर फ़ाइल निर्माण पर भरोसा नहीं कर सकते हैं। यदि आपका अगला कोड इस फ़ाइल पर निर्भर करता है, तो आप इसे स्मृति में रख सकते हैं या इसके लिए फाइल सिस्टम को मतदान कर सकते हैं। (लिनक्स के लिए चयन/एपोल है) – tuergeist

+0

हाँ यदि फ़ाइल बनाई गई है तो मैंने मतदान करके अस्थायी सुधार किया है। और हाँ जब फ़ाइल बनाई जा रही है तो दौड़ की स्थिति है। – user1631171

4

मैं इस सवाल का जवाब यहाँ 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(); 
    } 
} 
संबंधित मुद्दे