Запуск скрипта из Groovy - PullRequest
       55

Запуск скрипта из Groovy

6 голосов
/ 26 августа 2009

Чтобы приблизить мои настройки к «развертыванию одним щелчком», я хотел бы использовать скрипты groovy для запуска / остановки других процессов, управляемых скриптами bat, выполняющимися в разных частях файловой системы и даже на разных машинах.

Как выполнить эти скрипты и как это сделать из их соответствующего рабочего каталога?

Я знаю Java

java.lang.Runtime's exec()

Однако есть много проблем с этим, и я задавался вопросом, есть ли у Groovy также какая-то стенография для этого?

Спасибо!

Ответы [ 4 ]

11 голосов
/ 26 августа 2009

Groovy добавил метод execute () в простую старую строку, поэтому попробуйте это:

println "ls -la".execute().text
9 голосов
/ 29 августа 2009

Метод execute () можно использовать для изменения каталогов, если вы префиксируете его с помощью команды «cmd / c», а затем используете амперсанд (в предположении Windows) для объединения команд.

Пример, если вы хотите перейти в подкаталог subdir и запустить оттуда пару пакетных файлов:

println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text

Не уверен, что нет лучшего способа, но это работает.

1 голос
/ 06 июля 2011

Вы также можете использовать ProcessBuilder - удивительно удобный класс Java, представленный в Java 5.

ProcessBuilder позволяет вам

  • определить рабочий каталог
  • определить, какие переменные среды должен иметь процесс

См. http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html для краткого примера и дополнительной документации.

0 голосов
/ 13 декабря 2012

Если вы не боитесь создать какой-то повторно используемый код, вы можете создать объект, который оборачивает процесс .execute (). Я создал что-то подобное и регулярно им пользуюсь.

Создайте новый процесс с:

def proc = "cmd" .execute ()

После этого вы можете использовать «consumerProcessOutput ()» для управления вводом и выводом «proc». Все, что вы отправляете на него, будет действовать так, как если бы вы ввели его в оболочку, и все выходные данные этой оболочки будут вам доступны.

Я завернул все это в закрытие, чтобы вы могли сделать это:

cmd("cd \\ \n dir ") {
    if(it.contains("AUTOEXEC.BAT")) 
        println it;
    return true;
}

Чтобы отобразить только строку autoexec.bat. Обратите внимание, что до тех пор, пока вы не вернете истину из замыкания, доступен этот процесс, так что вы можете отправлять больше строк текста и взаимодействовать с ним неограниченное время.

Я использую его довольно редко, потому что такие команды, как "cd" и "Dir", не работают в Windows с .execute (), так что просто:

def directoryListing=cmd("cd\\\ndir")

поможет мне быстро получить список каталогов.

...