Добавление параметров в Runtime.getRuntime()?

void restartWeb() {
        try {
            String[] command = new String[] {"webRestarter.exe" , ">>","webLog.log"};
            Runtime.getRuntime().exec(command);
        } catch (java.io.IOException err) {
        webServer.logError(err.getMessage());
        }
    }

Почему это не работает? Как я могу это исправить, чтобы он работал так, как я хочу?

- выполняет webRestarter.exe с параметрами >>webLog.log

Так что это выплюнуло бы что-то вроде этого:

webRestarter.exe>>webLog.log

4 ответа

Решение

Вы просто не можете использовать трубы в exec вызов. Трубы - это функциональность оболочки, а не операционной системы. Поэтому мы должны вызвать исполняемый файл оболочки и передать команду. Попробуйте это вместо этого:

String[] command = new String[] {"cmd.exe", "/c", "start webRestarter.exe", ">>","webLog.log"};

Параметры передаются непосредственно в команду webRestarter.exe. Вы не можете использовать параметры для перенаправления стандартного вывода в файл, как это обычно делает ваш интерпретатор командной строки.

Однако метод exec() возвращает объект Process, который можно использовать для получения стандартного вывода и записи его в файл.

Источники:

http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html

http://download.oracle.com/javase/6/docs/api/java/lang/Process.html

Если я не ошибаюсь, каналы, перенаправления и т. Д. Являются функцией оболочки. В этом контексте это просто аргументы. Вы могли бы справиться с этим так же просто, как использовать cmd.exe с ключом /c в качестве части вашей команды, я думаю, что он справится с этим правильно или обрабатывать стандартный ввод / вывод самостоятельно (хотя это, как известно, чревато проблемами, я предпочитаю что-то как обыкновенный исполнитель).

Просто подумал, что упомяну две вещи, которые могут пригодиться для работы с процессами.

  1. ProcessBuilder - это хороший способ получить Process (в коде, предназначенном для запуска в 1.5+ JRE).

  2. Рекомендуется внимательно прочитать и выполнить все рекомендации, когда Runtime.exec() не будет.

Другие вопросы по тегам