现在,我正在编写一个Groovy脚本来调用其他人的接口。但是当运行脚本时,我需要更改当前的工作路径。我知道在Java中这是不可能的。在Groovy中是否有可能实现呢?
def processBuilder=new ProcessBuilder(command)
processBuilder.directory(new File("Working dir"))
def process = processBuilder.start()
或者command.execute(null, new File("Working dir"))
这样进程就会切换到您的新文件夹并在那里执行。
您可以将其包装在 dir 块中。
例如:
dir('yourdirectory') {
codeblock
}
据我所知,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
def cmd=new CommandShell()
println cmd.execute("cd /d c:\\")
println cmd.execute("dir") // Will be the dir of c:\
void setCurrentDirectory(new_dir_path) { System.setProperty("user.dir", new_dir_path) }
- Joe