मैं अपने जावा एप्लिकेशन से एक बैच फ़ाइल कैसे चलाऊं?


107

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

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

यह जावा में मेरे पास है:

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

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

जवाबों:


172

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

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

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

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


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

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

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

Win+R(रनटाइम) बैच फ़ाइलों को सीधे निष्पादित कर सकता है।
एलेक्स78191

21

कभी-कभी थ्रेड निष्पादन प्रक्रिया का समय JVM थ्रेड प्रतीक्षा प्रक्रिया समय से अधिक होता है, यह तब होता है जब आप जिस प्रक्रिया को लागू कर रहे हैं वह संसाधित होने में कुछ समय लेता है, वफ़र () कमांड का उपयोग निम्नानुसार करें:

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     

}

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


20
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() );
}

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

2
यह मेरे कोड में "ऐसा है" जैसे भ्रामक चर नाम रखने के लिए मुझे पागल कर देगा।
जॉन फिशर

14

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

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

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


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

12

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


2
क्यों ProcessBuilder जावा 5/6 में जाने का रास्ता है?
दान पॉलिटिक्स

2
एक पुरानी पोस्ट को पुनर्जीवित करने के लिए दिलचस्प विकल्प ... प्रोसेसब्यूलर अधिक नियंत्रण प्रदान करता है, खासकर स्टडआउट को आसानी से पुनर्निर्देशित करने की क्षमता। मुझे सेटअप भी अधिक सहज लगता है, लेकिन यह एक व्यक्तिगत
प्रीफ़ है

10

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

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

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

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

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


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

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

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

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

jdk1.5 और jdk1.6 के साथ परीक्षण किया गया

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


1
इसे जोड़ें ==> बफ़रडेडर रीडर = नया बफ़रडर (नया इनपुटस्ट्रीमरएडर (p.getInputStream ())); स्ट्रिंग लाइन = Reader.readLine (); जबकि (लाइन! = null) {System.out.println (लाइन); लाइन = Reader.readLine (); }
सूरन

2

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

मुझे पता है कि यह एक बड़ा कोड है, हालांकि मेरे लिए 100% काम किया जब यहां तक ​​कि Runtime.getRuntime (।)। निष्पादन () विफल रहा।

// 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();

1

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

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

/ c का क्या अर्थ है?
अमल लाल टीएल

0

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

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");

0

@ ईशा के अन्वेषक पर विस्तार करने के लिए, आप उस स्क्रिप्ट के लौटे आउटपुट (पोस्ट-फैक्टो में नहीं, वास्तविक समय में) को प्राप्त करने के लिए निम्नलिखित कार्य कर सकते हैं:

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.