L'esecuzione di uno script da Groovy
-
20-09-2019 - |
Domanda
Al fine di ottenere la mia messa a punto un po 'più vicino a "una distribuzione click", vorrei utilizzare script Groovy per avviare / arrestare altri processi controllati dagli script di pipistrello, in esecuzione in diverse parti del file system e anche su macchine diverse.
Come per eseguire questi script e come farlo da loro rispettive directory di lavoro?
Lo so di Java
java.lang.Runtime's exec()
Tuttavia ci sono un sacco di problemi con questo e mi chiedevo se Groovy aveva una specie di scorciatoia per questo pure?
Grazie!
Soluzione
Groovy ha aggiunto un metodo execute () per semplice vecchia stringa, in modo da provare questo:
println "ls -la".execute().text
Altri suggerimenti
Il execute () metodo può essere utilizzato per modificare le directory se si inserisce con il comando "cmd / c", e quindi utilizzare e commerciale (supponendo Windows) per i comandi a catena insieme.
Esempio, supponendo che si vuole andare a sotto directory subdir ed eseguire un paio di file batch da lì:
println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text
Non è sicuro se non c'è un modo migliore, ma questo funziona.
È inoltre possibile utilizzare ProcessBuilder che è una classe Java sorprendentemente comoda introdotto in Java 5.
ProcessBuilder consente di
- determinare la directory di lavoro
- determinare quali variabili ambientali il processo dovrebbe avere
http://download.oracle .com / JavaSE / 1.5.0 / docs / api / java / lang / ProcessBuilder.html per un breve esempio e altra documentazione.
Se non si ha paura di creare qualche codice riutilizzabile è possibile creare un oggetto che avvolge un processo .execute (). Ho creato qualcosa di simile e lo uso regolarmente.
Crea un nuovo processo con:
def proc = .Execute "cmd" ()
Dopo di che è possibile utilizzare "consumeProcessOutput ()" per gestire l'ingresso e l'uscita di "proc". Tutto ciò che si invia ad esso verrà agito come se digitato in un guscio, e tutta la potenza di quella conchiglia sarà disponibile per voi.
ho avvolto tutto questo in una chiusura in modo tale che si potrebbe fare questo:
cmd("cd \\ \n dir ") { if(it.contains("AUTOEXEC.BAT")) println it; return true; }
Per ottenere un display che mostra solo la linea autoexec.bat. Si noti che fino a tornare vero dalla chiusura, lo stdin di quel processo è disponibile in modo da poter inviare più righe di testo e di interagire con esso a tempo indeterminato.
Io lo uso un po 'perché i comandi come "cd" e "Dir" non funzionano in Windows con .execute (), quindi un semplice:
def directoryListing=cmd("cd\\\ndir")
si me ottenere una guida rapida messa in vendita con facilità.