6

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

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

我知道Java的

java.lang.Runtime's exec()

然而,这有很多问题,我想知道 Groovy 是否也有某种速记方式?

谢谢!

4

4 回答 4

11

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

println "ls -la".execute().text
于 2009-08-26T13:18:15.530 回答
9

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

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

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

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

于 2009-08-29T00:58:09.677 回答
1

您还可以使用 ProcessBuilder,它是 Java 5 中引入的一个非常方便的 Java 类。

ProcessBuilder 让您

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

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

于 2011-07-06T06:15:39.440 回答
0

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

创建一个新进程:

def proc="cmd".execute()

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

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

cmd("cd \\\n 目录") {
    if(it.contains("AUTOEXEC.BAT"))
        打印它;
    返回真;
}

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

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

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

会给我一个快速的目录列表很容易。

于 2012-12-12T20:21:04.313 回答