2009-03-05 23 views
96

मेरे जावा एप्लिकेशन में, मैं एक बैच फ़ाइल चलाने के लिए चाहता हूं जो "scons -Q implicit-deps-changed build\file_load_type export\file_load_type"मैं अपने जावा एप्लिकेशन से बैच फ़ाइल कैसे चला सकता हूं?

ऐसा लगता है कि मुझे निष्पादित करने के लिए मेरी बैच फ़ाइल भी नहीं मिल सकती है। मैं विचारों से बाहर हूं।

यह है कि मैं क्या जावा में है: पहले

Runtime. 
    getRuntime(). 
    exec("build.bat", null, new File(".")); 

, मैं एक अजगर Sconscript फ़ाइल है कि मैं चलाने के लिए चाहती थी लेकिन जब से बात नहीं बनी मैंने तय कर लिया कि मैं एक बैच फ़ाइल के माध्यम से स्क्रिप्ट कहेंगे लेकिन यह विधि अभी तक सफल नहीं हुई है।

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "build.bat"}); 

सैद्धांतिक रूप से आप भी इस तरह से SCons चलाने के लिए सक्षम होना चाहिए, हालांकि:

उत्तर

155

बैच फ़ाइलें निष्पादन योग्य नहीं हैं। उन्हें चलाने के लिए उन्हें एक आवेदन की आवश्यकता है (यानी cmd)।

यूनिक्स पर, स्क्रिप्ट फ़ाइल में फ़ाइल को शुरू करने वाले प्रोग्राम को निर्दिष्ट करने के लिए शेबैंग (#!) है। विंडोज एक्सप्लोरर द्वारा विंडोज़ में डबल-क्लिक किया जाता है। CreateProcess इसके बारे में कुछ भी नहीं जानता है।

Runtime. 
    getRuntime(). 
    exec("cmd /c start \"\" build.bat"); 

नोट: start \"\" आदेश के साथ, एक अलग कमांड विंडो एक रिक्त शीर्षक और वहाँ प्रदर्शित किया जाएगा बैच फ़ाइल से किसी भी उत्पादन के साथ खोला जाएगा। इसे केवल 'cmd/c build.bat' के साथ भी काम करना चाहिए, जिस स्थिति में आउटपुट को जावा में उप-प्रक्रिया से पढ़ा जा सकता है।

+0

मेरे लिए यह कहता है कि विंडोज़ "build.bat" नहीं ढूंढ सकता है। तो मुझे यह फाइल कहां रखनी चाहिए? या मुझे रास्ता कैसे देना चाहिए। कोई सुझाव? – nanospeck

+1

मान लें कि मेरे पास कमांड की एक सरणी है और फिर उस सरणी को सभी आदेशों को निष्पादित करने के लिए (i = 0 कमांड। लम्बाई) { रनटाइम.getRuntime()। Exec ("cmd/c start buil.bat") ; } फिर प्रत्येक पुनरावृत्ति के लिए (प्रत्येक आदेश के लिए) एक कमांड विंडो खोला जा रहा है जो स्पष्ट है। इससे कैसे बच सकता है मेरा मतलब है कि एक खिड़की पर सभी आदेशों को निष्पादित करना। – viveksinghggits

+0

हमारे पास कुछ कोड है जो सीधे "cmlew.bat" को इसके सामने "cmd/c" सामग्री डाले बिना कॉल कर रहा है, और वह कोड किसी भी तरह से काम कर रहा है। तो मुझे लगता है कि किसी भी समय जावा या विंडोज समस्या का निश्चित हिस्सा है। अगर हम "gradlew" निष्पादित करने का प्रयास करते हैं, जो विफल रहता है, तो अंत में ".bat" अभी भी स्पष्ट रूप से आवश्यक है। – Trejkaz

9

बैच स्क्रिप्ट को चलाने के लिए इस्तेमाल किया निष्पादन cmd.exe जो बैच फ़ाइल का नाम निर्दिष्ट करने के लिए /c ध्वज का उपयोग करता है चलाने के लिए है मैं परीक्षण नहीं किया यह:

Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build\file_load_type", "export\file_load_type"}); 

संपादित करें: Amara, आप का कहना है कि इस काम नहीं कर रहा। आपके द्वारा सूचीबद्ध त्रुटि वह त्रुटि है जो आपको विंडोज बॉक्स पर एक सिग्विन टर्मिनल से जावा चलाने पर प्राप्त होती है; क्या तुम यह कर रहे हो इसके साथ समस्या यह है कि विंडोज और सिग्विन के पास अलग-अलग पथ हैं, इसलिए जावा के विंडोज संस्करण को आपके सिग्विन पथ पर निष्पादन योग्य स्कैन नहीं मिलेगा। अगर यह आपकी समस्या साबित हो जाता है तो मैं आगे समझा सकता हूं।

+0

धन्यवाद। यह अभी भी काम नहीं करता है - कोड का वह टुकड़ा मेरे ऐप में भी निष्पादित नहीं होता है। मैं आपके द्वारा प्रस्तुत किए गए दूसरे विकल्प का प्रयास करूंगा। एक बार फिर धन्यवाद। – Amara

+0

जब मैं दूसरा विकल्प आज़माता हूं तो यह मुझे यह त्रुटि देता है: थ्रेड "मुख्य" java.io.IOException में अपवाद: प्रोग्राम "स्कैन" नहीं चला सकता: CreateProcess त्रुटि = 2, सिस्टम निर्दिष्ट फ़ाइल नहीं ढूंढ सकता – Amara

+0

नहीं, मैं नहीं करता सिग्विन टर्मिनल है। मैं विंडोज कमांड टर्मिनल का उपयोग करता हूं। यह अजीब बात है - मुझे नहीं पता कि यह क्यों काम नहीं करेगा। यह पूरी तरह से मुझे परेशान करता है। – Amara

11

ProcessBuilder बाहरी प्रक्रियाओं को चलाने के लिए जावा 5/6 तरीका है।

+1

प्रोसेसबिल्डर जावा 5/6 में जाने का तरीका क्यों है? –

+2

पुरानी पोस्ट को पुनर्जीवित करने के लिए दिलचस्प विकल्प ... Processbuilder अधिक नियंत्रण प्रदान करता है, विशेष रूप से stderr को stdout पर आसानी से रीडायरेक्ट करने की क्षमता। मैं सेटअप को और अधिक सहज महसूस करता हूं, लेकिन यह एक निजी pref – basszero

18
Runtime runtime = Runtime.getRuntime(); 
try { 
    Process p1 = runtime.exec("cmd /c start D:\\temp\\a.bat"); 
    InputStream is = p1.getInputStream(); 
    int i = 0; 
    while((i = is.read()) != -1) { 
     System.out.print((char)i); 
    } 
} catch(IOException ioException) { 
    System.out.println(ioException.getMessage()); 
} 
+0

है इस कोड पर टिप्पणी करना और हमें बताएं कि इनपुटस्ट्रीम क्यों और क्या पढ़ रहा है, और मुझे क्यों परवाह है। इसके अलावा, बैच फ़ाइल के लिए कोड अच्छी तरह से चल रहा है, लेकिन मैं इसे एक त्रुटि अपवाद उठाने के लिए नहीं मिल सकता है। –

+0

यह मेरे कोड में "है" के रूप में इस तरह के भ्रमित चर नाम के लिए मुझे पागल ड्राइव करेगा। –

20

कभी कभी धागा निष्पादन प्रक्रिया में समय JVM धागा प्रक्रिया की तुलना में अधिक समय इंतजार कर इस प्रकार, जब प्रक्रिया आप लागू कर रहे हैं संसाधित करने के लिए कुछ समय लगता है तो होना ही उपयोग करते हैं, waitFor() आदेश का उपयोग है:

try{  
    Process p = Runtime.getRuntime().exec("file location here, don't forget using/instead of \\ to make it interoperable"); 
    p.waitFor(); 

}catch(IOException ex){ 
    //Validate the case the file can't be accesed (not enought permissions) 

}catch(InterruptedException ex){ 
    //Validate the case the process is being stopped by some external situation  

} 

इस प्रकार जेवीएम प्रोसेस तक रुक जाएगा निबंध जिसे आप आमंत्रित कर रहे हैं वह थ्रेड निष्पादन स्टैक के साथ जारी रखने से पहले किया जाता है।

13

जावा का उपयोग कर बैच फ़ाइलों को चलाने के लिए करता है, तो यह है कि आप के बारे में बात कर रहे हैं ...

String path="cmd /c start d:\\sample\\sample.bat"; 
Runtime rn=Runtime.getRuntime(); 
Process pr=rn.exec(path);` 

यह करना चाहिए।

+8

प्रश्न का समाधान पहले से ही एक समाधान समाधान के साथ किया गया था। आपको केवल उन समाधानों की पेशकश करनी चाहिए जो आप जानते हैं कि काम कर रहे हैं और वर्णन करते हैं कि आपको लगता है कि आपका समाधान बेहतर क्यों हो सकता है। – Smamatti

3
Process p = Runtime.getRuntime().exec( 
    new String[]{"cmd", "/C", "orgreg.bat"}, 
    null, 
    new File("D://TEST//home//libs//")); 

जेडीके 1.5 और जेडीके 1 के साथ परीक्षण किया गया।6

यह मेरे लिए ठीक काम कर रहा था, उम्मीद है कि यह दूसरों की भी मदद करता है। यह पाने के लिए मैंने और अधिक दिनों तक संघर्ष किया है। :(

+1

यह जोड़ें ==> BufferedReader रीडर = नया BufferedReader (नया इनपुटस्ट्रीम रीडर (p.getInputStream())); \t \t \t स्ट्रिंग लाइन = reader.readLine(); \t \t \t \t \t \t \t जबकि (लाइन = अशक्त!) { \t \t \t \t println (लाइन); \t \t \t \t लाइन = पाठक।पढ़ने के लिए लाइन(); \t \t \t} – Suren

0

निम्नलिखित ठीक काम कर रहा है:

String path="cmd /c start d:\\sample\\sample.bat"; 
Runtime rn=Runtime.getRuntime(); 
Process pr=rn.exec(path); 
2

मैं एक ही मुद्दा था लेकिन कभी कभी सीएमडी मेरी फ़ाइलों को चलाने के लिए विफल रही है है यही कारण है कि मैं अपने डेस्कटॉप पर एक temp.bat बनाने के लिए, यह अस्थायी अगले।। .bat मेरी फ़ाइल को चलाने जा रहा है, और अगली temp फ़ाइल को हटाया जा रहा है।

मुझे पता है कि यह एक बड़ा कोड है, हालांकि 100% में मेरे लिए काम किया, यहां तक ​​कि Runtime.getRuntime()। exec() असफल।

// creating a string for the Userprofile (either C:\Admin or whatever) 
String userprofile = System.getenv("USERPROFILE"); 

BufferedWriter writer = null; 
     try { 
      //create a temporary file 
      File logFile = new File(userprofile+"\\Desktop\\temp.bat"); 
      writer = new BufferedWriter(new FileWriter(logFile)); 

      // Here comes the lines for the batch file! 
      // First line is @echo off 
      // Next line is the directory of our file 
      // Then we open our file in that directory and exit the cmd 
      // To seperate each line, please use \r\n 
      writer.write("cd %ProgramFiles(x86)%\\SOME_FOLDER \r\nstart xyz.bat \r\nexit"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       // Close the writer regardless of what happens... 
       writer.close(); 
      } catch (Exception e) { 
      } 

     } 

     // running our temp.bat file 
     Runtime rt = Runtime.getRuntime(); 
     try { 

      Process pr = rt.exec("cmd /c start \"\" \""+userprofile+"\\Desktop\\temp.bat"); 
      pr.getOutputStream().close(); 
     } catch (IOException ex) { 
      Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); 

     } 
     // deleting our temp file 
     File databl = new File(userprofile+"\\Desktop\\temp.bat"); 
     databl.delete(); 
0

यह कोड पथ दो:/फ़ोल्डर/फ़ोल्डर में मौजूद दो कमांड.बैट निष्पादित करेगा।

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat"); 
संबंधित मुद्दे

 संबंधित मुद्दे