2010-09-10 2 views
0

Я пытаюсь выполнить пакетный файл в своем приложении Java. Код выглядит следующим образом:Проблема с исполнением командного файла в Java

Runtime.getRuntime().exec("cmd /C start C:/Documents and Settings/Zatko/My Documents/Project-Workspace/IUG/external/apps/archive/run-server.bat"); 

Когда он выполняет, диалоговое окно ошибки появится сообщение о «Windows не удается найти„C:/Documents“. Убедитесь, что вы ввели имя corretly ....»

Когда Я выполняю с тем же кодом другой командный файл с именем file.bat и находится в папке C:/Temp, он отлично работает.

Кто-нибудь знает, где проблема? Это о символах интервала?

Заранее спасибо

ответ

2

Edit:

Кажется, команда запуска требуется дополнительный параметр, когда путь к исполняемому файлу для запуска заключенную в этом «Как один должен окружать параметров, который содержит пробелы путем.» немного запутан, так как стартовая команда работает как исключенная, если у вас есть путь без пробелов и, таким образом, не заключает его в ". Вот что произошло, когда я протестировал код ниже для папки c:/temp и работал без дополнительного параметр

Этот параметр является заголовком окна, в котором i . Он должен иметь второй параметр и, если он содержит пробелы, должен быть окружен «

Я предлагаю всегда использовать« для названия и пути.

Так вот обновленная команда:

Вы должны приложить

с:./Документ и Настройки/...

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

Для Java, который будет:

Runtime.getRuntime() Exec ("CMD/C старт \" Сервер \ "\" C:./Документы и Настройки/Zaťko/Мои документы /Project-Workspace/IUG/external/apps/archive/run-server.bat \ "");

Greetz, GHAD

+0

Я выполнил инструкцию. Однако, когда я иду, чтобы запустить код, появится окно командной строки DOS с мигающим курсором на C: \ Documents и Settings \ Затько \ Мои документы \ Project-Workspace \ IUG \> – Anto

+0

Проверьте, если ваш сервер был запущен уже. Пусть командный файл запускает процесс, который оставляет окно команды открытым. Когда я пытаюсь выполнить партию, содержащую только команду паузы, она отлично работает здесь. – GHad

+0

Нет, сервер не запущен ... – Anto

2

Это гораздо лучше использовать массив:

String[] array = { ... }; 
Runtime.getRuntime().exec(array); 

как в

String[] array = { "cmd", "/C", "start", 
    "C:/Documents and Settings/Zatko/My Documents/.../run-server.bat" }; 
Runtime.getRuntime().exec(array); 

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

+0

может привести пример использования в вышеуказанной ситуации? –

+0

Я, конечно же, подумал, что это же и попробовал, но это не сработает! Он открывает только окно команд с текущей папкой в ​​качестве корня проекта (то же, что указано в комментарии пользователя toony выше) –

+0

У меня есть причина, проверьте мой ответ ниже –

0

Это работает:

List<String> templst = new ArrayList<String>();

templst.add("cmd");

templst.add("/C");

templst.add("start");

templst.add("backup.bat");

Process p = rt.exec(templst.toArray(new String[]{}), null, new File(path));

+0

не пытайтесь использовать/b флаг, он не работает в таком случае. Вместо этого просто напишите exit как последнюю команду в вашем пакетном файле. –

2
Runtime.getRuntime().exec("cmd /C start \"\" \"C:/Documents and Settings/Zatko/My Documents/Project-Workspace/IUG/external/apps/archive/run-server.bat\""); 

должно работать.

Вам нужно указать аргументы с пробелами или метасимволами оболочки в них. И start ожидает, что первый цитируемый аргумент будет заголовком окна, поэтому дайте ему пустой, чтобы он был счастлив.

Смежные вопросы