كيف يمكنني تشغيل ملف دفعي من بلدي تطبيق جافا؟

StackOverflow https://stackoverflow.com/questions/615948

  •  03-07-2019
  •  | 
  •  

سؤال

في تطبيق جافا لي، أريد أن تشغيل ملف دفعي يستدعي "scons -Q implicit-deps-changed build\file_load_type export\file_load_type"

ويبدو أن لا أستطيع حتى الحصول على ملف دفعي جهدي لتنفيذه. أنا من الأفكار.

وهذا هو ما قلته في جاوة:

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

وقبل ذلك، كان لدي ملف بايثون Sconscript التي أردت أن تشغيل ولكن منذ ذلك لم ينجح قررت أن أسميه النص البرمجي عبر ملف دفعي ولكن لم تكن هذه الطريقة ناجحة اعتبارا من بعد.

هل كانت مفيدة؟

المحلول

والملفات الدفعية ليست للتنفيذ. انهم بحاجة تطبيق لتشغيلها (أي كمد).

في UNIX، الملف النصي له كوخ (#!) في بداية الملف لتحديد البرنامج الذي ينفذ ذلك. يتم تنفيذ النقر المزدوج في ويندوز عن طريق مستكشف Windows. CreateProcess لا يعرف شيئا عن ذلك.

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

ملحوظة: مع الأمر start \"\"، سيتم فتح نافذة قيادة منفصلة مع عنوان فارغ وأي الإخراج من ملف دفعي سيتم عرضها هناك. وينبغي أيضا أن العمل مع عادل `كمد / ج build.bat"، وفي هذه الحالة إخراج يمكن قراءتها من عملية فرعية في جاوة إذا رغبت في ذلك.

نصائح أخرى

وأحيانا موضوع الوقت في عملية التنفيذ هو أعلى من موضوع 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     

}

وهذه الطريقة سوف وقف JVM حتى تتم العملية كنت الاحتجاج قبل أن تستمر مع مكدس إعدام الموضوع.

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

لتشغيل الملفات الدفعية باستخدام جافا اذا كان هذا الذي نتحدث عنه ...

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

وهذا ينبغي أن نفعل ذلك.

ProcessBuilder هو جافا 5 / 6 طريقة لتشغيل العمليات الخارجية.

والقابل للتنفيذ المستخدمة لتشغيل البرامج النصية الدفعي cmd.exe الذي يستخدم العلم /c لتحديد اسم الملف الدفعي لتشغيل:

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

ونظريا يجب عليك أيضا أن تكون قادرة على تشغيل Scons بهذه الطريقة، على الرغم من أنني لم تختبر هذا:

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

وتحرير: العمارة، ويقول لك أن هذا لا يعمل. الخطأ الذي المذكورة هي خطأ كنت تحصل عند تشغيل جافا من محطة سيغوين على مربع ويندوز؛ هذا هو ما تفعلونه؟ المشكلة مع ذلك هو أن ويندوز وسيغوين ديك مسارات مختلفة، وبالتالي فإن نسخة من ويندوز جافا لم تجد scons للتنفيذ على مسار سيغوين الخاص بك. أنا يمكن أن تفسر زيادة إذا كان هذا تبين أن مشكلتك.

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

واختبارها مع jdk1.5 وjdk1.6

وكان هذا العمل على ما يرام بالنسبة لي، وآمل أن يساعد الآخرين أيضا. للحصول على هذا لقد كافح أكثر أيام. : (

وكان لي نفس المشكلة. ولكن في بعض الأحيان فشل CMD لتشغيل الملفات الخاصة بي. هذا هو السبب في أنني إنشاء 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();

وفيما يلي يسير على ما يرام:

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

وهذا الرمز سيتم تنفيذ اثنين commands.bat التي توجد في مسار C: / المجلدات / مجلد

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

لتوسيع في @ anwser العشاء في الذي يمكن فقط قم بما يلي للحصول على الناتج عاد (آخر الامر الواقع وليس في الجرمية-ltime) من البرنامج النصي الذي تم تشغيله:

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top