Java Runtime.getRuntime.exec (CMD) с длинными параметрами - PullRequest
0 голосов
/ 22 июня 2011

Я создаю интерфейс для приложения командной строки. Он очень длинный. Командная строка похожа на это:

public String liveShellCommand(){

  String cmd="command mode --parameter arg --parameter2 arg2 --parameter3 arg3";

  Runtime run = Runtime.getRuntime() ;
  Process pr ;
    try {
       log.progress("sending command: " +cmd);       
       pr = run.exec( cmd );
       pr.waitFor() ;

Кажется, все работает, пока я не добавлю в него переключатель режима. Переключатель «mode» выполняется из командной строки. Я пробовал несколько комбинаций, разделяющих параметры в массив, который тоже не выполняется. Я думаю, что это как-то связано с тем, что у «режима» нет - перед ним, и у него не может быть - перед ним.

Что я делаю не так?

edit: Я забыл упомянуть, что все, что я вижу, это: Отладчик остановился на некомпилируемом исходном коде. Я использую NetBeans, и он, кажется, не распечатывает след стека. Останавливается на run.exec (cmd). Что-то не так с Java?

Мне удалось использовать ProcessBuilder, чтобы запустить его без просто сбоя ...

Он отлично разбирает "команду", но когда я добавляю "командный режим"

 java.io.IOException: Cannot run program "command mode": java.io.IOException: error=2, No such file or directory

Так что я не могу разобрать.

Ответы [ 3 ]

6 голосов
/ 22 июня 2011

+ 1 для отправки аргументов в виде массива.

Отправка всего через строку может работать в некоторых системах, но не в других.

Process start = Runtime.getRuntime().exec(new String[]
{ "java", "-version" });
BufferedReader r = new BufferedReader(
     new InputStreamReader(start.getErrorStream()));
String line = null;
while ((line = r.readLine()) != null)
{
    System.out.println(line);
}

Я знаю, что вы сказаличто вы попытались передать аргументы в виде массива строк безуспешно, но получили ли вы другой тип ошибки?Если эта другая программа имеет журнал, вы можете посмотреть, что происходит не так.Вы можете написать простой скрипт, который выводит параметры, с которыми он был вызван, для проверки того, что на самом деле происходит.

1 голос
/ 26 августа 2015

Используйте ProcessBuilder и передайте ему строку []

     String[] cmmm = {arg3,arg4,arg5, arg6,arg7 };
     ProcessBuilder pb = new ProcessBuilder(cmmm);
     pb.directory(new File(tDir));
     Process p = pb.start();
0 голосов
/ 27 июня 2011

Массив был ответом.Я также использовал ArrayList из-за сложности команд.В любом случае ... Определен массив, добавлены команды, преобразован в массив, отображен массив, отправлены команды ... Все работало хорошо.Каждый параметр должен быть в своей собственной строке в массиве.

    List<String> list = new ArrayList<>();
    list.add("command");
    list.add("param");
    String[] command = (String[]) list.toArray(new String[0]);
    log.progress (list);
    run.exec (command);
...