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

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

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

Я знаю Java

java.lang.Runtime's exec()

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

Спасибо!


person raoulsson    schedule 26.08.2009    source источник


Ответы (4)


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

println "ls -la".execute().text
person John Flinchbaugh    schedule 26.08.2009
comment
вам повезло, что ls является автономным исполняемым файлом, а не встроенной командой оболочки. - person Alexander Stohr; 26.01.2021

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

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

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

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

person seansand    schedule 29.08.2009
comment
для чего-то подобного в системе Linux вам может понадобиться сделать такой вариант: [ 'sh', '-c', 'ваши-команды-здесь']. одна строка уже находится там под капотом (она может быть частью спецификации API, а может и не быть). - person Alexander Stohr; 26.01.2021

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

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

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

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

person Marco    schedule 06.07.2011
comment
Я поддерживаю это. Вот сообщение в блоге, в котором объединены Groovy и Процессбилдер - person FabienB; 27.01.2015

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

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

деф proc="cmd".execute()

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

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

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

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

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

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

даст мне быстрый список каталогов с легкостью.

person Bill K    schedule 12.12.2012