আমি কীভাবে আমার জাভা অ্যাপ্লিকেশন থেকে ব্যাচ ফাইল চালাব?


107

আমার জাভা অ্যাপ্লিকেশনটিতে, আমি একটি ব্যাচ ফাইল চালাতে চাই যা কল করে "scons -Q implicit-deps-changed build\file_load_type export\file_load_type "

দেখে মনে হচ্ছে যে আমি আমার ব্যাচের ফাইলটি কার্যকর করতে পারি না। আমি ধারণার বাইরে।

জাভাতে আমার যা আছে:

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

পূর্বে, আমার কাছে পাইথন স্কোনস্ক্রিপ্ট ফাইল ছিল যা আমি চালাতে চেয়েছিলাম তবে যেহেতু এটি কার্যকর হয়নি আমি সিদ্ধান্ত নিয়েছিলাম একটি ব্যাচ ফাইলের মাধ্যমে স্ক্রিপ্টটি কল করব তবে সে পদ্ধতিটি এখনও সফল হয়নি।

উত্তর:


172

ব্যাচ ফাইলগুলি কার্যকর করা যায় না। এগুলি চালানোর জন্য তাদের একটি অ্যাপ্লিকেশন প্রয়োজন (অর্থাত সেন্টিমিটার)।

ইউনিক্স-এ স্ক্রিপ্ট ফাইলটিতে একটি প্রোগ্রাম শুরুতে শেবাং (#!) রয়েছে যা প্রোগ্রামটি কার্যকর করে তা নির্দিষ্ট করে দেয়। উইন্ডোজ ডাবল ক্লিক উইন্ডোজ এক্সপ্লোরার দ্বারা সঞ্চালিত হয়। CreateProcessসে সম্পর্কে কিছুই জানে না।

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

দ্রষ্টব্য: start \"\"কমান্ডের সাথে একটি ফাঁকা শিরোনাম সহ একটি পৃথক কমান্ড উইন্ডো খোলা হবে এবং ব্যাচ ফাইলের যে কোনও আউটপুট সেখানে প্রদর্শিত হবে। এটি ঠিক `সেমিডি / সি বিল্ডব্যাট" দিয়েও কাজ করা উচিত, সেক্ষেত্রে জাভাতে সাব-প্রক্রিয়া থেকে আউটপুটটি পড়া যেতে পারে can


আমার জন্য এটি বলে যে উইন্ডোজ "বিল্ড.বাট" খুঁজে পাবে না। তাহলে আমি এই ফাইলটি কোথায় রাখব? বা আমি কীভাবে পথ দেব। কোনও পরামর্শ?
ন্যানোস্পেক

1
আসুন বলতে পারি যে আমার কাছে কমান্ডগুলির একটি অ্যারে রয়েছে এবং তারপরে (i = 0 কমান্ডস.লাইনেটি) time রানটাইম.জেটআরটাইম ()। এক্সিকিউট ("সেমিডি / সি স্টার্ট বুইল.ব্যাট") এর জন্য সমস্ত কমান্ড কার্যকর করতে সেই অ্যারেটি পুনরায় করা যায়; every তারপরে প্রতিটি পুনরাবৃত্তির জন্য (প্রতিটি কমান্ডের জন্য) একটি কমান্ড উইন্ডো খোলা হচ্ছে যা সুস্পষ্ট। এটি কীভাবে এড়ানো যায় যা আমি বোঝাতে চাইছি একটি উইন্ডোতে সমস্ত কমান্ড কার্যকর করা।
Viveksinghggits

1
আমাদের কিছু কোড রয়েছে যা সামনে "সেন্টিমিডি / সি" স্টাফ না রেখে সরাসরি "গ্রেডল.ব্যাট" ডাকছে এবং সেই কোডটি কোনওভাবে কাজ করছে। সুতরাং আমি মনে করি জাভা বা উইন্ডোজ উভয়ই কোনও স্থানে সমস্যার নির্দিষ্ট অংশ। যদি আমরা "গ্রেডলিউ" চালানোর চেষ্টা করি তবে এটি ব্যর্থ হয়, সুতরাং স্পষ্টতই ".bat" এর শেষেও প্রয়োজন।
ট্রেজকাজ

Win+R(রানটাইম) সরাসরি ব্যাচ ফাইলগুলি কার্যকর করতে পারে।
Alex78191

21

কখনও কখনও থ্রেড এক্সিকিউশন প্রক্রিয়া সময়টি জেভিএম থ্রেড অপেক্ষার প্রক্রিয়ার সময়ের চেয়ে বেশি হয়, আপনি যখন যে প্রক্রিয়াটি ব্যবহার করছেন সেটি প্রক্রিয়া করতে কিছুটা সময় নেয়, ওয়েটফোর্ড () কমান্ডটি নীচে ব্যবহার করুন:

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     

}

থ্রেড এক্সিকিউশন স্ট্যাকটি চালিয়ে যাওয়ার আগে আপনি যে প্রক্রিয়াটি চালাচ্ছেন প্রক্রিয়া শেষ না হওয়া পর্যন্ত এইভাবে JVM থামবে।


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
এই কোডটি মন্তব্য করা এবং ইনপুট স্ট্রিমটি কেন এবং কী পড়ছে এবং কেন আমি যত্নশীল তা আমাদের জানাতে দরকারী হবে। এছাড়াও, ব্যাচ ফাইলের কোডটি দুর্দান্তভাবে চলছে, তবে ব্যতিক্রম ব্যতীত আমি এটি পেতে পারি না।
বারুচ আত্তা

2
এটি আমার কোডটিতে "হ'ল" এর মতো বিভ্রান্তিকর পরিবর্তনশীল নাম রাখার জন্য আমাকে বাদামকে চালিত করবে।
জন ফিশার

14

জাভা ব্যবহার করে ব্যাচ ফাইল চালানোর জন্য যদি আপনি এর কথা বলছেন ...

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

এটি করা উচিত।


10
প্রশ্নের সমাধান ইতিমধ্যে একটি কার্যক্ষম সমাধান দিয়ে দেওয়া হয়েছিল was আপনি যে কাজ করছেন জানেন কেবল তার সমাধান দেওয়া উচিত এবং আপনার সমাধান কেন আরও ভাল হতে পারে বলে আপনি বর্ণনা করতে পারেন।
স্মাট্টি

12

প্রসেসবিল্ডার হ'ল বাহ্যিক প্রক্রিয়াগুলি চালানোর জাভা 5/6 উপায়।


2
প্রসেসবিল্ডার কেন জাভা 5/6 যাওয়ার পথে?
ড্যান পোলাইটস 10:51

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"});

সম্পাদনা: আমারা, আপনি বলছেন যে এটি কাজ করছে না। উইন্ডোজ বাক্সে সাইগউইন টার্মিনাল থেকে জাভা চালানোর সময় আপনি যে ত্রুটিটি তালিকাভুক্ত করেছেন তা হ'ল; এই আপনি কি করছেন? এর সাথে সমস্যাটি হ'ল উইন্ডোজ এবং সাইগউইনের বিভিন্ন পথ রয়েছে, তাই জাভা এর উইন্ডোজ সংস্করণটি আপনার সাইগউইন পথটিতে কার্যকর স্কোনগুলি খুঁজে পাবে না। এটি যদি আপনার সমস্যা হিসাবে পরিণত হয় তবে আমি আরও ব্যাখ্যা করতে পারি।


ধন্যবাদ. এটি এখনও কাজ করে না - কোডটির এই অংশটি আমার অ্যাপ্লিকেশনটিতেও কার্যকর হয় না। আপনার উপস্থাপিত অন্য বিকল্পটি আমি চেষ্টা করব। আবার ধন্যবাদ.
আমারা

আমি যখন দ্বিতীয় বিকল্পটি চেষ্টা করি তখন এটি আমাকে এই ত্রুটিটি দেয়: থ্রেড ব্যতীত "মূল" java.io.IOException: প্রোগ্রামটি "স্ক্যানস" চালানো যায় না: ক্রিয়েটপ্রসেস ত্রুটি = 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 ())); স্ট্রিং লাইন = রিডার.ড্রেডলাইন (); যখন (রেখা! = নাল) {System.out.println (লাইন); লাইন = রিডার.ড্রেডলাইন (); }
সুরেন

2

আমারো একই ইস্যু ছিল. তবে কখনও কখনও সিএমডি আমার ফাইলগুলি চালাতে ব্যর্থ হয়েছিল। সে কারণেই আমি আমার ডেস্কটপে একটি টেম্প্যাট.বেট তৈরি করি, এর পরের এই টেম্প.ব্যাটটি আমার ফাইলটি চালাচ্ছে এবং তারপরে টেম্প ফাইলটি মোছা হবে।

আমি জানি এটি একটি বৃহত্তর কোড, যদিও রানটাইম.জেটআরটাইম ()। এক্সিকিউট () ব্যর্থ হয়ে গেলেও 100% এ আমার জন্য কাজ করেছিল।

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

/ সি বলতে কী বোঝায়?
অমল লাল টিএল

0

এই কোডটি দুটি কমান্ড কার্যকর করবে bat

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

0

@ Ishaশার আনসারকে প্রসারিত করতে আপনি চালিত স্ক্রিপ্টটির রিটার্ন আউটপুট ( রি-লাইমেটে পোস্ট-ফ্যাক্টো) পেতে কেবল নিম্নলিখিতটি করতে পারেন:

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.