Ausführen eines Skripts von Groovy
-
20-09-2019 - |
Frage
Um mein Setup etwas näher an "One -Click -Bereitstellung" zu bringen, möchte ich groovige Skripte verwenden, um andere Prozesse zu starten/zu stoppen, die von Fledermausskripten gesteuert werden, die in verschiedenen Teilen des Dateisystems und sogar auf verschiedenen Maschinen ausgeführt werden.
Wie man diese Skripte ausführt und wie man es macht ihr jeweils Arbeitsverzeichnis?
Ich kenne Javas
java.lang.Runtime's exec()
Es gibt jedoch viele Probleme damit und ich habe mich gefragt, ob Groovy auch dafür eine Art Abkürzung hatte.
Vielen Dank!
Lösung
Groovy fügte eine execute () -Methode hinzu, um alte Zeichenfolge zu machen. Versuchen Sie also Folgendes:
println "ls -la".execute().text
Andere Tipps
Mit der Methode execute () kann es verwendet werden, um Verzeichnisse zu ändern, wenn Sie sie mit dem Befehl "cmd /c" vorfixieren und dann Ampersand (Annahme Windows) zusammenfassen, um Befehle zusammenzubringen.
Beispiel unter der Annahme, dass Sie zum Unterverzeichnis gehen möchten Subdir und führen Sie einige Batch -Dateien von dort aus:
println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text
Ich bin mir nicht sicher, ob es keinen besseren Weg gibt, aber das funktioniert.
Sie können auch ProcessBuilder verwenden, einer überraschend verängstigten Java -Klasse, die in Java 5 eingeführt wird.
ProcessBuilder lässt Sie
- Bestimmen Sie das Arbeitsverzeichnis
- Bestimmen Sie, welche Umgebungsvariablen der Prozess haben sollte
Sehen http://download.oracle.com/javase/1.5.0/docs/api/java/lang/processbuilder.html für ein kurzes Beispiel und mehr Dokumentation.
Wenn Sie keine Angst davor haben, einen wiederverwendbaren Code zu erstellen, können Sie ein Objekt erstellen, das einen .execute () -Prozess wickelt. Ich habe so etwas erstellt und es regelmäßig benutzt.
Erstellen Sie einen neuen Prozess mit:
def proc = "cmd" .execute ()
Danach können Sie "ConsumeProcessOutput ()" verwenden, um die Eingabe und Ausgabe von "Proc" zu verwalten. Alles, was Sie daran senden, wird so reagiert, als hätten Sie sie in eine Hülle eingetippt, und der gesamte Ausgang dieser Hülle steht Ihnen zur Verfügung.
Ich habe das alles in einen Verschluss eingeschlossen, damit Sie dies tun können:
cmd("cd \\ \n dir ") { if(it.contains("AUTOEXEC.BAT")) println it; return true; }
Um ein Display zu erhalten, das nur die autoexec.bat -Linie anzeigt. Beachten Sie, dass der Stdin dieses Vorgangs bis Sie aus dem Verschluss true, sodass Sie mehr Textzeilen senden und auf unbestimmte Zeit mit ihm interagieren können.
Ich benutze es ziemlich viel, weil Befehle wie "CD" und "Dir" in Windows nicht mit .execute () funktionieren, also einfach:
def directoryListing=cmd("cd\\\ndir")
Ich werde mir mit Leichtigkeit eine kurze Verzeichnisliste bringen.