2013-08-12 6 views

Antwort

6

Da Groovy auf JVM läuft, gelten dieselben Einschränkungen. Leider ist das nicht möglich.

Changing the current working directory in Java?

JDK bug

+0

gestern habe ich es auf Stackoverflow zu suchen, kann es auf diese Weise arbeiten: 'Leere SetCurrentDirectory (new_dir_path) { \t System.setProperty ("user.dir", new_dir_path) }' – Joe

+0

@ Joe Nein, es wird nicht, lese die Java-Frage, die ich verlinkt habe. –

+0

Ja. Ich habe getestet, es wird nicht. Danke. – Joe

4

Wenn Sie andere Skript als separaten Prozess ausgeführt werden kann, können Sie Process Parameter Arbeits dir geben:

def processBuilder=new ProcessBuilder(command) 
processBuilder.directory(new File("Working dir")) 
def process = processBuilder.start() 

oder

command.execute(null, new File("Working dir")) 

so dass Prozess wird zu Ihrem neuen Ordner wechseln und führe es dort aus.

1

Java/groovy hat eigentlich kein Arbeitsverzeichnis, soweit ich das beurteilen kann. Die Shell, die groovy gestartet hat, hat eine und alle untergeordneten "Befehle" erben direkt von dieser Shell.

Java scheint auch das aktuelle Verzeichnis der Shell zu lesen und in "user.dir" zu speichern. Dies wird als Basis für das "File" -Objekt verwendet. Wenn Sie also System.setProperty ("user.dir", "c:/windows") verwenden, wird es zukünftige Aufrufe der neuen Datei (".") Ändern, aber nicht die Eltern-Shell-Verzeichnis (und daher nicht die Kind-Verzeichnisse).

Hier sind drei „Work-Arounds“, die für verschiedene Szenarien arbeiten kann:

1) Ich überwand ART dies für eine ganz bestimmte Aufgabe ... Ich wollte ein starkes Skript implementieren „cd“, wie. Das war nur möglich, weil alle meine Skripte bereits in einer Batch-Datei "eingepackt" waren. Ich habe es so gemacht, dass mein Skript eine Datei namens "afterburner.cmd" erstellen könnte, die, wenn sie existiert, beim Beenden des Skripts ausgeführt würde. Es gab einige Batch-Datei-Tricks, um das zu erreichen.

Eine Start-Cmd-Datei könnte auch das aktuelle Verzeichnis "setzen", bevor Sie Ihr grooviges Skript/App aufrufen.

Übrigens, ein Startup cmd war viel hilfreicher, als ich dachte - es macht Ihre Umgebung konstant und ermöglicht es Ihnen, Ihre "Skripte" einfacher auf anderen Rechnern zu implementieren. Ich habe sogar meine Skripte zu .classes kompilieren lassen, weil es sich als schneller herausstellte, ein .groovy in eine .class zu kompilieren und die .class mit "Java" zu starten, als das Skript einfach mit "groovy" - und auszuführen normalerweise können Sie den Kompilierungsschritt überspringen, der es viel schneller macht!

2) Für ein paar kleine Befehle könnten Sie eine Methode wie folgt schreiben:

def currentDir = "C:\\" 
def exec(command, dir = null) { 
    "cmd /c cd /d ${dir?:currentDir} && $command".execute().text 
} 

// Default dir is currentDir 
assert exec("dir").endsWith("C:\\>") 

// different dir for this command only 
assert exec("dir", "c:\\users").endsWith("C:\\users") 

// Change default dir 
currentDir = "C:\\windows" 
assert exec("dir").endsWith("C:\\windows") 

es wird langsamer sein als „“ .execute(), wenn Sie „cmd“ ist nicht erforderlich.

3)-Code eine kleine Klasse, die ein Befehl „Öffnen“ Shell unterhält (ich dies einmal getan hat, es ein bisschen Komplexität ist), aber die Idee ist:

def process="cmd".execute() 
def in=process.in 
def out=process.out 
def err=process.err 

Now „in“ ist eine Eingabestrom, den Sie auslesen/auslesen können und "out" ist ein Ausgabestrom, in den Sie Befehle schreiben können, behalten Sie "err" im Auge, um Fehler zu erkennen.

Die Klasse sollte einen Befehl in die Ausgabe schreiben, die Eingabe lesen, bis der Befehl abgeschlossen wurde, und dann die Ausgabe an den Benutzer zurückgeben.

Das Problem erkennt, wenn die Ausgabe eines gegebenen Befehls abgeschlossen ist. Im Allgemeinen können Sie eine Eingabeaufforderung "C: ..." erkennen und annehmen, dass dies bedeutet, dass der Befehl ausgeführt wurde. Sie können auch eine Zeitüberschreitung verwenden. Beide sind ziemlich fehlbar. Sie können die Eingabeaufforderung dieser Shell auf etwas Einzigartiges einstellen, um sie weniger fehlbar zu machen.

Der Vorteil ist, dass diese Shell für die gesamte Lebensdauer Ihrer App geöffnet bleiben und die Geschwindigkeit erheblich erhöhen kann, da Sie nicht wiederholt "cmd" -Schalen erstellen. Wenn Sie eine Klasse erstellen (nennen wir es „Commandshell“), dass Ihr Prozess wickelt Objekt dann sollte es wirklich einfach zu bedienen sein:

def cmd=new CommandShell() 
println cmd.execute("cd /d c:\\") 
println cmd.execute("dir") // Will be the dir of c:\ 

ich eine groovige Klasse wie dieses hat einmal geschrieben, es ist viel zu experimentieren und Ihre Instanz kann durch Befehle wie "exit" zerstört werden, aber es ist möglich.