Как я могу запустить несколько команд только в одном окне cmd в Java?

то, что я хотел бы сделать, это запустить batch файл несколько раз из приложения java. Поэтому я установил for-loop который запускает этот код n раза:

for (int i = 0; i < n; i++) {
    Runtime.getRuntime().exec("cmd /c start somefile.bat");
}

проблема в том, что теперь при каждом запуске команды появляется новое окно cmd. Однако то, что я хочу, это просто один окно, которое появляется в начале и используется для отображения всех данных из следующих вызовов команд.

как я могу это сделать?

2 ответов


С && вы можете выполнять несколько команд, одну за другой:

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

использование нескольких команд и символов условной обработки

можно выполнять несколько команд из одной командной строки или сценария с помощью сиволов условной обработки. При выполнении нескольких команд с условными символами обработки команды справа от условного символа обработки действуют на основе результатов команда слева от символа условной обработки.

например, может потребоваться выполнить команду только в случае сбоя предыдущей команды. Или может потребоваться выполнить команду только в том случае, если предыдущая команда выполнена успешно. Для передачи нескольких команд можно использовать специальные символы, перечисленные в следующей таблице.

& [...] command1 & command2
Используется для разделения нескольких команд в одной командной строке. УМК.exe запускает первую команду, а затем вторую команда.

&& [...] command1 && command2
Использовать для выполнения команды&&, только если команда, стоящая перед символом успеха. УМК.exe запускает первую команду, а затем запускает вторую команду, только если первая команда выполнена успешно.

|| [...] command1 || command2
Используйте для выполнения следующей команды / / только в том случае, если предыдущая команда || не выполняется. УМК.exe запускает первую команду, а затем запускает вторую команду, только если первая команда не завершена успешно (полученный код ошибки превышает ноль).

( ) [...] (command1 & command2)
Используется для группировки или вложения команд.

; or , command1 parameter1;parameter2
Используется для разделения параметров команды.


Я бы использовал Java ProcessBuilder или другой класс, который имитирует/использует оболочки. Следующий фрагмент демонстрирует идею (для Linux с 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();
    }
}

обратите внимание, что это только фрагмент, который должен быть адаптирован для Windows, но в целом он должен работать с cmd.exe.