2013-06-12 5 views
6

का उपयोग कर बीएटी फ़ाइल से आउटपुट प्राप्त करें मैं एक .bat फ़ाइल चलाने और आउटपुट प्राप्त करने का प्रयास कर रहा हूं। मैं इसे चला सकते हैं, लेकिन मैं परिणाम जावा में नहीं मिल सकता है:जावा

String cmd = "cmd /c start C:\\workspace\\temp.bat"; 

Runtime r = Runtime.getRuntime(); 
Process pr = r.exec(cmd); 

BufferedReader stdInput = new BufferedReader(
    new InputStreamReader(pr.getInputStream())); 

String s ; 
while ((s = stdInput.readLine()) != null) { 
    System.out.println(s); 
} 

परिणाम null है। कोई विचार नहीं कि मुझे यह क्यों मिलता है। ध्यान दें कि मैं विंडोज 7 का उपयोग कर रहा हूं।

+0

पढ़ें (और लागू) * सभी * की सिफारिशों [जब Runtime.exec() नहीं होगा] (http://www.javaworld.com/jw-12-2000/jw-1229-traps.html) । इससे समस्या हल हो सकती है। यदि नहीं, तो इसे विफल होने के कारण इसे और जानकारी प्रदान करनी चाहिए। फिर अनदेखा करें कि यह 'exec' को संदर्भित करता है और' ProcessBuilder' का उपयोग करके 'प्रक्रिया' का निर्माण करता है। तर्कों के लिए खाते में 'स्ट्रिंग [] args' में' स्ट्रिंग तर्क 'को भी तोड़ दें जिसमें स्वयं रिक्त स्थान हों। –

उत्तर

4

"Cmd/c का उपयोग करना शुरू करें [...] "बैच फ़ाइल चलाने के लिए सीधे अपनी बैच फ़ाइल चलाने की बजाय एक उप प्रक्रिया तैयार करेगी।

इस प्रकार, आपके पास इसके आउटपुट तक पहुंच नहीं होगी। यह काम करने के लिए, आप का उपयोग करना चाहिए:

String cmd = "C:\\workspace\\temp.bat"; 

यह Windows XP के तहत काम करता है।

+0

यह हल मैं एक और समस्या है जो बल्लेबाजी फ़ाइल शुरू run.bat कमान शामिल है और मैं अन्य परिणाम की जरूरत भी :( – Muath

+1

आप अपने प्राथमिक अंदर एक अन्य बैच फ़ाइलों को चलाने के लिए ** कॉल ** उपयोग कर सकते हैं स्क्रिप्ट। [कड़ी] देखें (http://www.robvanderwoude.com/call.php) और [कड़ी] (http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en- हमें/call.mspx? mfr = true) संदर्भों के लिए। –

3

आपको process.waitFor() पर कॉल करने के बाद टर्मिनल आउटपुट स्ट्रीम पढ़ने और कंसोल पर कॉपी करने के लिए आपको एक नया थ्रेड शुरू करने की आवश्यकता है।

की तरह कुछ कार्य करें:

String line; 
Process p = Runtime.getRuntime().exec(...); 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
input.close(); 

बेहतर दृष्टिकोण ProcessBuilder वर्ग का उपयोग करने के लिए, और की तरह कुछ लिखने का प्रयास होगा:

ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
builder.redirectInput(); 
Process process = builder.start(); 

while ((line = reader.readLine()) != null) { 
    System.out.println ("Stdout: " + line); 
} 
+0

दोस्त मैंने कोशिश की कि यह काम नहीं करता है, मुझे ProcessBuilder में कमांड परिणाम – Muath

+0

के बजाय शून्य मान मिल रहा है, कोई .redirectInput() नहीं है; विधि कोई सुझाव? मैं NetBeans BTW – Muath

-1
BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getErrorStream())); 

बजाय का उपयोग

BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getInputStream)); 
+0

का उपयोग करता हूं त्रुटि स्ट्रीम को अनदेखा न करें। मजबूत कोड के लिए, दोनों का उपभोग किया जाना चाहिए। –

+0

दोनों के लिए लूप को अलग-अलग –

+0

की आवश्यकता होती है, यह वास्तव में प्रश्न का उत्तर नहीं देती है। –