Как я могу запустить несколько команд только в одном окне 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
.