Как открыть командную строку и вставить команды с помощью Java? - PullRequest
38 голосов
/ 14 января 2011

Можно ли открыть командную строку (и я предполагаю, что любой другой терминал для других систем) и выполнять команды в только что открывшемся окне?

В настоящее время у меня есть следующее:

Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});

Я попытался добавить следующую команду после «запуска», я попытался запустить другой rt.exec, содержащий мою команду, ноЯ не могу найти способ заставить это работать.

Если это имеет значение, я пытаюсь выполнить команду, подобную этой:

java -flag -flag -cp terminal-based-program.jar

EDIT К сожалению, у меня были некоторые странные результаты.Я был в состоянии успешно запустить командную строку и передать команду, используя это:

rt.exec("cmd.exe /c start command");

Однако, кажется, что он работает только с одной командой.Потому что, если я попытаюсь использовать такой разделитель команд, как «cmd.exe / c start command & command2», вторая команда будет проходить через фон (как если бы я просто использовал rt.exec («command2»);),Теперь проблема в том, что я понял, что мне нужно изменить каталог, в котором запускается командная строка, потому что, если я просто использую полный путь к файлу jar, файл jar неправильно считывает данные из активного каталога командной строки, а некаталог фляги, который содержит его ресурсы.

Ответы [ 9 ]

23 голосов
/ 15 января 2011

Я знаю, что люди рекомендуют держаться подальше от rt.exec (String), но это работает, и я не знаю, как изменить его на версию массива.

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
8 голосов
/ 11 июня 2012
public static void main(String[] args) {
    try {
        String ss = null;
        Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
        BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        writeer.write("dir");
        writeer.flush();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        System.out.println("Here is the standard output of the command:\n");
        while ((ss = stdInput.readLine()) != null) {
            System.out.println(ss);
        }
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((ss = stdError.readLine()) != null) {
            System.out.println(ss);
        }

    } catch (IOException e) {
        System.out.println("FROM CATCH" + e.toString());
    }

}
8 голосов
/ 16 января 2011

Если вы запускаете две команды одновременно, чтобы просто изменить каталог, в котором запускается командная строка, существует перегрузка для метода Runtime.exec, который позволяет вам указать текущий рабочий каталог.Например,

Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));

Откроется командная строка в каталоге на newDir.Я думаю, что ваше решение также работает, но это делает вашу командную строку или массив немного чище.

Существует перегрузка для команды в виде строки и команды в виде массива String.

Возможно, вам даже будет проще использовать ProcessBuilder , который имеет метод directory для установки текущего рабочего каталога.

Надеюсь, это поможет.

3 голосов
/ 14 января 2011

На Snow Leopard у меня работает следующее:

Runtime rt = Runtime.getRuntime();
String[] testArgs = {"touch", "TEST"};
rt.exec(testArgs);

Дело в том, что если вы хотите прочитать выходные данные этой команды, вам нужно прочитать входной поток процесса.Например,

Process pr = rt.exec(arguments);
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream()));

Позволяет вам довольно легко читать построчный вывод команды.

Проблема также может заключаться в том, что MS-DOS не интерпретирует ваш порядокаргументы означают «начать новую командную строку».Ваш массив, вероятно, должен быть:

{"start", "cmd.exe", "\ c"}

Чтобы открыть команды в новой командной строке, вам необходимо использоватьСсылка на процесс.Но я не уверен, почему вы захотите сделать это, если вы можете просто использовать exec, как прокомментировал человек до меня.

2 голосов
/ 10 мая 2017

Вам просто нужно добавить свою команду после запуска в строку, которую вы передаете.

String command = "cmd.exe /c start "+"*your command*";

Process child = Runtime.getRuntime().exec(command);
0 голосов
/ 07 февраля 2019
String[] command = {"cmd.exe" , "/c", "start" , "cmd.exe" , "/k" , "\" dir && ipconfig 
\"" };
ProcessBuilder probuilder = new ProcessBuilder( command );
probuilder.directory(new File("D:\\Folder1"));
Process process = probuilder.start();
0 голосов
/ 18 января 2019

Вы должны тщательно установить все \" (цитаты). Параметр \k используется, чтобы оставить командную строку открытой после выполнения.

1) для объединения 2 команд используйте (например, pause и ipconfig)

Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());

2) для отображения содержимого файла (MORE - средство просмотра командной строки в Windows)

File selectedFile = new File(pathToFile):
Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());

Одна вложенная кавычка \ "для команды и имени файла, вторая кавычка \" для самого имени файла, для пробелов и т. Д. В имени.

0 голосов
/ 26 апреля 2018

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

Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\rakhee\\Obligation Extractions\" && dir");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\oxyzen-workspace\\BrightleafDesktop\\Obligation Extractions\" && dir");
0 голосов
/ 23 декабря 2017

Пожалуйста, поместите вашу команду в параметр, подобный указанному ниже.

Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
...