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!

È stato utile?

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top