How can I run multiple commands in just one cmd windows in Java?

后端 未结 4 1370
小蘑菇
小蘑菇 2020-12-02 21:31

what I would like to do is run a batch file multiple times from a java application. Therefore I set up a for-loop that runs this code n

相关标签:
4条回答
  • 2020-12-02 22:04
    public void TestCommandRun(){
    
    Process process = null;
            String[] command_arr = new String[]{"cmd.exe","/K","start"};
            ProcessBuilder pBuilder = new ProcessBuilder("C:/Windows/System32/cmd.exe");
            try{
                process = pBuilder.start();
            }
            catch(IOException e){
                e.printStackTrace();
                System.out.println("Process failed");
            }
            if(null != process){
                OutputStream out = process.getOutputStream();
                OutputStreamWriter outWriter = new OutputStreamWriter(out);
                BufferedWriter bWriter = new BufferedWriter(outWriter);
                try{
                    bWriter.write("dir");
                    bWriter.newLine();
                    bWriter.write("ipconfig");
                    bWriter.flush();
                    bWriter.close();
                }
                catch(IOException e){
                    e.printStackTrace();
                    System.out.println("bWriter Failed");
                }
                
            }
        }
    
    0 讨论(0)
  • 2020-12-02 22:11

    With && you can execute more than one commands, one after another:

    Runtime.getRuntime().exec("cmd /c \"start somefile.bat && start other.bat && cd C:\\test && test.exe\"");
    

    Using multiple commands and conditional processing symbols

    You can run multiple commands from a single command line or script using conditional processing symbols. When you run multiple commands with conditional processing symbols, the commands to the right of the conditional processing symbol act based upon the results of the command to the left of the conditional processing symbol.

    For example, you might want to run a command only if the previous command fails. Or, you might want to run a command only if the previous command is successful. You can use the special characters listed in the following table to pass multiple commands.

    & [...] command1 & command2
    Use to separate multiple commands on one command line. Cmd.exe runs the first command, and then the second command.

    && [...] command1 && command2
    Use to run the command following && only if the command preceding the symbol is successful. Cmd.exe runs the first command, and then runs the second command only if the first command completed successfully.

    || [...] command1 || command2
    Use to run the command following || only if the command preceding || fails. Cmd.exe runs the first command, and then runs the second command only if the first command did not complete successfully (receives an error code greater than zero).

    ( ) [...] (command1 & command2)
    Use to group or nest multiple commands.

    ; or , command1 parameter1;parameter2
    Use to separate command parameters.

    0 讨论(0)
  • 2020-12-02 22:11

    I would use Java's ProcessBuilder or another class which simulates/uses a shell. The following snippet demonstrates the idea (for Linux with bash).

    import java.util.Scanner;
    import java.io.*;
    
    public class MyExec {
        public static void main(String[] args)
        {
            //init shell
            ProcessBuilder builder = new ProcessBuilder( "/bin/bash" );
            Process p=null;
            try {
                p = builder.start();
            }
            catch (IOException e) {
                System.out.println(e);
            }
            //get stdin of shell
            BufferedWriter p_stdin = 
              new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    
            // execute the desired command (here: ls) n times
            int n=10;
            for (int i=0; i<n; i++) {
                try {
                    //single execution
                p_stdin.write("ls");
                p_stdin.newLine();
                p_stdin.flush();
                }
                catch (IOException e) {
                System.out.println(e);
                }
            }
    
            // finally close the shell by execution exit command
            try {
                p_stdin.write("exit");
                p_stdin.newLine();
                p_stdin.flush();
            }
            catch (IOException e) {
                System.out.println(e);
            }
    
        // write stdout of shell (=output of all commands)
        Scanner s = new Scanner( p.getInputStream() );
        while (s.hasNext())
        {
            System.out.println( s.next() );
        }
           s.close();
        }
    }
    

    Please note that it is only a snippet, which needs to be adapted for Windows, but in general it should work with cmd.exe.

    0 讨论(0)
  • 2020-12-02 22:16

    @Jost Im so sorry but Im not allowed to comment. I still need 50 reputations. The solution you offered was the perfect one. I was searching for a long time. I simply wrote some test class for windows and everythink works perfectly. Thanks a lot.

    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.util.Scanner;
    
    public class Main {
    
        private BufferedWriter p_stdin;
    
        public Main() {
    
            // init shell
            ProcessBuilder builder = new ProcessBuilder("C:/Windows/System32/cmd.exe");
            Process p = null;
            try {
                p = builder.start();
            } catch (IOException e) {
                System.out.println(e);
            }
            // get stdin of shell
            p_stdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    
            // execute commands
            executeCommand("@echo off");
            executeCommand("cd rsc");
            executeCommand("exit");
    
            // write stdout of shell (=output of all commands)
            Scanner s = new Scanner(p.getInputStream());
            while (s.hasNext()) {
                System.out.println(s.next());
            }
            s.close();
    
        }
    
        private void executeCommand(String command) {
            try {
                // single execution
                p_stdin.write(command);
                p_stdin.newLine();
                p_stdin.flush();
            } catch (IOException e) {
                System.out.println(e);
            }
        }
    
        public static void main(String[] args) {
            new Main();
        }
    }
    
    0 讨论(0)
提交回复
热议问题