Добавление параметров в 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 в качестве части вашей команды, я думаю, что он справится с этим правильно или обрабатывать стандартный ввод / вывод самостоятельно (хотя это, как известно, чревато проблемами, я предпочитаю что-то как обыкновенный исполнитель).
Просто подумал, что упомяну две вещи, которые могут пригодиться для работы с процессами.
ProcessBuilder - это хороший способ получить Process (в коде, предназначенном для запуска в 1.5+ JRE).
Рекомендуется внимательно прочитать и выполнить все рекомендации, когда Runtime.exec() не будет.