2009-08-26 15 views
6

Per rendere il mio setup un po 'più vicino alla "distribuzione con un clic", vorrei utilizzare gli script Groovy per avviare/arrestare altri processi controllati da script bat, eseguiti in diverse parti del filesystem e anche su macchine diverse.Esecuzione di uno script da Groovy

Come eseguire questi script e come farlo da loro directory di lavoro rispettivi?

So di

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 Java?

Grazie!

risposta

11

Groovy ha aggiunto un metodo execute() per semplice vecchia stringa, in modo da provare questo:

println "ls -la".execute().text 
+0

Non sono ancora sicuro di cambiare la directory di lavoro. –

+0

Grazie finora! Mi piace un sacco! – raoulsson

9

Il metodo execute() può essere utilizzato per cambiare directory se si inserisce con il comando "cmd/c" e quindi usa la e commerciale (assumendo Windows) per concatenare i comandi.

esempio, supponendo che si vuole andare a sottodirectory subdir ed eseguire un paio di file batch da lì:

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

Non sono sicuro se non c'è un modo migliore, ma questo lavoro.

1

È anche 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

Vedere http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html per un breve esempio e ulteriore documentazione.

+0

Secondo. Ecco [un post sul blog] (http://www.joergm.com/2010/09/executing-shell-commands-in-groovy/) che combina Groovy e ProcessBuilder – FabienB

0

Se non si ha paura di creare un codice riusabile, è possibile creare un oggetto che avvolge un processo .execute(). Ho creato qualcosa di simile e lo uso regolarmente.

creare un nuovo processo con:

def proc = .Execute "cmd"()

Dopo di che è possibile utilizzare "consumeProcessOutput()" per gestire l'ingresso e l'uscita di "proc". Qualsiasi cosa tu invii verrà eseguita come se l'avessi inserita in una shell e tutti gli output di quella shell saranno disponibili per te.

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 quando non si restituisce true dalla chiusura, lo stdin di quel processo è disponibile in modo da poter inviare più righe di testo e interagire con esso indefinitamente.

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") 

me otterrà un elenco di directory rapida facilmente.

Problemi correlati