Как выполнить командный файл из Java? - PullRequest
9 голосов
/ 14 сентября 2009

Я хочу выполнить командный файл из Java-программы.

Я использую следующую команду.

Runtime.getRuntime().exec("server.bat");

Но проблема в том, что я хочу дать путь к переменной вместо абсолютного, чтобы я мог развернуть этот проект Java на любом компе.

Структура dir проекта выглядит следующим образом:

com
   |
  project
   |
   ------ parser
   |         |_____ Main.java
   |
   -------util
             |_____ Server.bat

Я хочу запустить файл «Server.bat» в каталоге «util» из файла «Main.java» в каталоге «parser».

Ответы [ 7 ]

8 голосов
/ 14 сентября 2009

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

.

Пример:

ProcessBuilder pb = new ProcessBuilder("server.bat");
pb.directory(new File(deployDir + "\\com\\project\\util"));
Process p = pb.start();
int exitStatus = p.waitFor();

Конечно, ваше приложение должно откуда-то получать deployDir. Его можно установить в среде, в файле конфигурации приложения, это может быть текущий каталог пользователя или что-то еще.

6 голосов
/ 14 сентября 2009

Вы должны запустить «cmd.exe» с аргументами «/ c» и «server.bat»:

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } );
5 голосов
/ 14 сентября 2009

Когда Java работает и вы используете Runtime.exec () с относительным путем, относительное означает относительное относительно текущего каталога пользователя, где была вызвана JVM.

Это может сработать

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat");

если вы запускаете Java из родительского каталога com.

Или вы должны рассчитать абсолютный путь:

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat");

Я забыл, прочитал Когда Runtime.exec () не .

4 голосов
/ 14 сентября 2009

Вы можете попробовать его на рабочем столе, если поддерживается (Java 1.6)

    File file = new File("server.bat");
    Desktop.getDesktop().open(file);
0 голосов
/ 14 сентября 2009

Второй параметр для exec - это строка [] аргументов для настроек среды (значение null означает наследование текущих параметров процесса), а третьим параметром для exec должен быть файл, предоставляющий рабочий каталог. Попробуйте это:

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));
0 голосов
/ 14 сентября 2009

Лучше всего, чтобы вы сохранили каталог установки приложения в системе, а затем использовали его для построения ваших путей в приложении. System.getProperty ("user.dir") должен работать на платформах Windows и Unix для получения текущего рабочего каталога, но это зависит от системы, поэтому имейте это в виду.

0 голосов
/ 14 сентября 2009

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

Commandline cl = new Commandline();

cl.setExecutable( "cmd.exe" );
cl.createArg().setValue( "/c" );

cl.setWorkingDirectory( new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat"));

cl.createArg().setValue( "/c" );

StreamConsumer consumer = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

StreamConsumer stderr = new StreamConsumer() {
    public void consumeLine( String line ) {
        //do something with the line
    }
};

int exitCode;

try {
    exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() );
} catch ( CommandLineException ex ) {
    //handle exception
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...