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

  • 本文关键字:工作 Groovy groovy cwd
  • 更新时间 :
  • 英文 :


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

如果您可以将其他脚本作为单独的进程运行,则可以为ProcessBuilder参数提供工作目录:

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

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

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

由于Groovy在JVM上运行,所以也有同样的限制。不幸的是,这是不可能的。

更改Java中的当前工作目录?

JDK错误

您可以将其封装在一个dir块中。例如:

dir('yourdirectory') {
   codeblock
}
据我所知,Java/groovy并没有真正"拥有"一个工作目录。启动groovy的shell有一个和任何子"命令"直接继承自该shell。

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

以下是三种可能适用于不同场景的"工作激励":

1) 我克服了这一点,完成了一项非常具体的任务。。。我想将"cd"实现为一个groovy脚本。这是可能的,因为我所有的脚本都已经被"包装"在一个批处理文件中了。我这样做是为了让我的脚本可以创建一个名为"afterburner.cmd"的文件,如果它存在,就会在脚本退出时执行。有一些批处理文件的伎俩使这项工作。

启动cmd文件也可以在调用groovy脚本/应用程序之前"设置"当前目录。

顺便说一句,拥有一个启动cmd比我想象的要有用得多——它使你的环境保持不变,并允许你更容易地将你的"脚本"部署到其他机器上。我甚至把我的脚本编译到.classes,因为事实证明,把.groovy编译到.cclass并用"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) 编写一个维护"Open"命令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"之类的命令破坏,但这是可能的。

相关内容

  • 没有找到相关文章

最新更新