如何在Groovy中更改当前工作目录

16

现在,我正在编写一个Groovy脚本来调用其他人的接口。但是当运行脚本时,我需要更改当前的工作路径。我知道在Java中这是不可能的。在Groovy中是否有可能实现呢?

4个回答

26
如果您可以将其他脚本作为单独的进程运行,那么您可以给ProcessBuilder参数提供工作目录:
def processBuilder=new ProcessBuilder(command)
processBuilder.directory(new File("Working dir"))
def process = processBuilder.start()
或者
command.execute(null, new File("Working dir"))

这样进程就会切换到您的新文件夹并在那里执行。


7
由于Groovy运行在JVM上,因此同样存在限制。不幸的是,这是不可能的。
更改Java中的当前工作目录?
JDK错误。

昨天我在Stack Overflow上搜索了一下,它能以这种方式工作吗?:void setCurrentDirectory(new_dir_path) { System.setProperty("user.dir", new_dir_path) } - Joe
是的,我已经测试过了,它不会。谢谢你。 - Joe

4

您可以将其包装在 dir 块中。

例如:

dir('yourdirectory') {
   codeblock
}

3

据我所知,Java/groovy实际上没有“工作目录”。启动groovy的Shell有一个工作目录,任何子“命令”都直接继承自该Shell。

Java还似乎会读取Shell的当前目录并将其存储在“user.dir”中。这被用作“File”对象的基础,因此如果您执行System.setProperty("user.dir", "c:/windows"),它将更改对新的File(".")的调用,但不会更改父Shell目录(因此也不会更改子目录)。

以下是三种可能适用于不同场景的“解决方法”:

1) 我为非常具体的任务“部分地”克服了这个问题…我想要将“cd”实现为groovy脚本。这只有在我的所有脚本已经被包装在批处理文件中时才可能。我使得我的脚本可以创建一个名为“afterburner.cmd”的文件,如果存在,则在脚本退出时执行该文件。有一些批处理文件技巧可以使这项工作顺利完成。

启动cmd文件还可以在调用您的groovy脚本/应用程序之前“设置”当前目录。

顺便说一句,拥有一个启动cmd比我想象的要有用得多——它使您的环境保持恒定,并使您更容易将您的“脚本”部署到其他计算机上。我甚至将我的编译器编译成.classes,因为编译.groovy文件成.class文件并使用“Java”启动.class文件比使用“groovy”运行脚本快得多——而且通常可以跳过编译步骤,这使它变得非常快!

2) 对于一些小命令,您可能编写以下方法:

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

如果不需要"cmd",那么它比"".execute()更慢。

3)编写一个小的类来维护一个“打开”命令行shell(我曾经做过这个,有一些复杂性),但是想法是:

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

现在,“in”是一个输入流,您可以从中读取/分离,“out”是一个输出流,您可以向其写入命令,并监视“err”以检测错误。
该类应将命令写入输出,读取输入,直到命令完成,然后将输出返回给用户。
问题在于如何检测任何给定命令的输出是否完成。一般来说,您可以检测“C:…”提示并假定这意味着命令已经执行完毕。您也可以使用超时。两者都非常容易出错。您可以将shell的提示设置为某些独特的内容,以使其更加可靠。
优点是,此shell可以在应用程序的整个生命周期内保持打开状态,并且可以显著提高速度,因为您不会反复创建“cmd” shell。如果您创建了一个包装您的Process对象的类(我们称之为“CommandShell”),那么使用起来应该非常容易:
def cmd=new CommandShell()
println cmd.execute("cd /d c:\\")
println cmd.execute("dir") // Will be the dir of c:\

我曾经编写过这样的Groovy类,它需要进行大量的实验,而且您的实例可能会被像“exit”这样的命令破坏,但这是可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接