为了让我的设置更接近“一键部署”,我想使用 groovy 脚本来启动/停止由 bat 脚本控制的其他进程,这些进程在文件系统的不同部分甚至不同的机器上运行。
如何执行这些脚本以及如何从它们各自的工作目录执行?
我知道Java的
java.lang.Runtime's exec()
然而,这有很多问题,我想知道 Groovy 是否也有某种速记方式?
谢谢!
为了让我的设置更接近“一键部署”,我想使用 groovy 脚本来启动/停止由 bat 脚本控制的其他进程,这些进程在文件系统的不同部分甚至不同的机器上运行。
如何执行这些脚本以及如何从它们各自的工作目录执行?
我知道Java的
java.lang.Runtime's exec()
然而,这有很多问题,我想知道 Groovy 是否也有某种速记方式?
谢谢!
Groovy 为普通的旧字符串添加了一个 execute() 方法,所以试试这个:
println "ls -la".execute().text
如果使用“cmd /c”命令作为前缀,则可以使用 execute() 方法更改目录,然后使用与号(假设是 Windows)将命令链接在一起。
例如,假设您要转到子目录subdir并从那里运行几个批处理文件:
println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text
不确定是否有更好的方法,但这确实有效。
您还可以使用 ProcessBuilder,它是 Java 5 中引入的一个非常方便的 Java 类。
ProcessBuilder 让您
有关简短示例和更多文档,请参阅http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html。
如果您不害怕创建一些可重用的代码,您可以创建一个包装 .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")
会给我一个快速的目录列表很容易。