A execução de um script Groovy
-
20-09-2019 - |
Pergunta
A fim de obter a minha configuração um pouco mais perto de "um clique de implantação", eu gostaria de usar scripts groovy para iniciar/parar a outros processos controlados pelo bastão de scripts em execução em diferentes partes do sistema de arquivos e até mesmo em máquinas diferentes.
Como executar esses scripts e como fazê-lo a partir de seus respectivo directório de trabalho?
Eu sei do Java
java.lang.Runtime's exec()
No entanto, existem muitos problemas com isso e eu me perguntava se Groovy tinha algum tipo de taquigrafia para esta bem?
Obrigado!
Solução
Groovy adicionou um método Execute () à corda antiga simples, então tente o seguinte:
println "ls -la".execute().text
Outras dicas
O método Execute () pode ser usado para alterar os diretórios se você o prefixar com o comando "CMD /C" e, em seguida, use o AMPERSAND (assumindo o Windows) para acorrentar os comandos.
Exemplo, assumindo que você deseja ir ao subdiretório subdir e execute alguns arquivos em lote a partir daí:
println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text
Não tenho certeza se não há uma maneira melhor, mas isso funciona.
Você também pode usar ProcessBuilder que é um surpreendentemente convienent classe Java introduzidos no java 5.
ProcessBuilder permite que você
- determinar o diretório de trabalho
- determinar quais variáveis ambientais o processo deveria ter
Ver http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html por um breve exemplo e mais documentação.
Se você não tem medo de criar algum código reutilizável, poderá criar um objeto que envolva um processo .Execute (). Eu criei algo assim e o uso regularmente.
Crie um novo processo com:
def proc = "cmd" .execute ()
Depois disso, você pode usar "ConsumeProcessOutput ()" para gerenciar a entrada e saída de "proc". Tudo o que você enviar para ele será agido como se você o digitasse em um shell, e toda a saída desse shell estará disponível para você.
Eu embrulhei tudo isso em um fechamento para que você pudesse fazer isso:
cmd("cd \\ \n dir ") { if(it.contains("AUTOEXEC.BAT")) println it; return true; }
Para obter uma tela que mostra apenas a linha AutoExec.bat. Observe que, até que você retorne true do fechamento, o stdin desse processo está disponível para que você possa enviar mais linhas de texto e interagir com ele indefinidamente.
Eu o uso bastante porque comandos como "CD" e "dir" não funcionam no Windows com .execute (), então um simples:
def directoryListing=cmd("cd\\\ndir")
Vai me dar uma lista rápida de diretório com facilidade.