现在,我正在编写一个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似乎还读取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"之类的命令破坏,但这是可能的。