How do I run a batch file from my Java Application?

后端 未结 11 1677
情书的邮戳
情书的邮戳 2020-11-22 00:42

In my Java application, I want to run a batch file that calls \"scons -Q implicit-deps-changed build\\file_load_type export\\file_load_type\"

It seems t

相关标签:
11条回答
  • 2020-11-22 01:20

    I had the same issue. However sometimes CMD failed to run my files. That's why i create a temp.bat on my desktop, next this temp.bat is going to run my file, and next the temp file is going to be deleted.

    I know this is a bigger code, however worked for me in 100% when even Runtime.getRuntime().exec() failed.

    // 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 讨论(0)
  • 2020-11-22 01:21
    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)
  • 2020-11-22 01:21

    ProcessBuilder is the Java 5/6 way to run external processes.

    0 讨论(0)
  • 2020-11-22 01:25

    Sometimes the thread execution process time is higher than JVM thread waiting process time, it use to happen when the process you're invoking takes some time to be processed, use the waitFor() command as follows:

    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     
    
    }
    

    This way the JVM will stop until the process you're invoking is done before it continue with the thread execution stack.

    0 讨论(0)
  • 2020-11-22 01:25

    To expand on @Isha's anwser you could just do the following to get the returned output (post-facto not in rea-ltime) of the script that was run:

    try {
        Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
        System.out.println(process.getText());
    } catch(IOException e) {
        e.printStackTrace();
    }
    
    0 讨论(0)
提交回复
热议问题