从Groovy运行脚本

时间:2009-08-26 12:21:42

标签: groovy scripting groovyshell

为了使我的设置更接近“一键部署”,我想使用groovy脚本来启动/停止由bat脚本控制的其他进程,在文件系统的不同部分运行,甚至在不同的机器上运行。

如何执行这些脚本以及如何从他们的各自的工作目录中执行这些脚本?

我知道Java的

java.lang.Runtime's exec()

然而,这有很多问题,我想知道Groovy是否也有这种简写?

谢谢!

4 个答案:

答案 0 :(得分:11)

Groovy为普通的旧String添加了一个execute()方法,所以试试这个:

println "ls -la".execute().text

答案 1 :(得分:9)

如果使用“cmd / c”命令为它添加前缀,则可以使用execute()方法更改目录,然后使用&符号(假设Windows)将命令链接在一起。

示例,假设您要转到子目录 subdir 并从那里运行几个批处理文件:

println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text

不确定是否有更好的方法,但这确实有效。

答案 2 :(得分:1)

您还可以使用ProcessBuilder,它是java 5中引入的令人惊讶的快速Java类。

ProcessBuilder让你

  • 确定工作目录
  • 确定流程应具有哪些环境变量

有关简要示例和更多文档,请参阅http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html

答案 3 :(得分:0)

如果您不害怕创建一些可重用的代码,则可以创建一个包装.execute()进程的对象。我创造了这样的东西并定期使用它。

使用以下命令创建新流程:

def proc =“cmd”.execute()

之后,您可以使用“consumeProcessOutput()”来管理“proc”的输入和输出。您发送给它的任何内容都将被操作,就像您将其键入shell一样,并且该shell的所有输出都可供您使用。

我将所有这些都包装在一个闭包中,以便你可以这样做:

cmd("cd \\ \n dir ") {
    if(it.contains("AUTOEXEC.BAT")) 
        println it;
    return true;
}

获取仅显示autoexec.bat行的显示。请注意,在从闭包返回true之前,该进程的stdin可用,因此您可以发送更多行文本并无限期地与其进行交互。

我使用它相当多,因为像“cd”和“Dir”这样的命令在带有.execute()的窗口中不起作用,所以很简单:

def directoryListing=cmd("cd\\\ndir")

将轻松为我提供快速目录列表。