题
为了让我的设置更接近“一键部署”,我想使用 groovy 脚本来启动/停止由 bat 脚本控制的其他进程,在文件系统的不同部分甚至不同的机器上运行。
如何执行这些脚本以及如何执行 他们的 各自的工作目录?
我知道Java的
java.lang.Runtime's exec()
然而这有很多问题,我想知道 Groovy 是否也有某种速记法?
谢谢!
解决方案
Groovy的加入execute()方法,以普通的旧字符串,所以尝试这样:
println "ls -la".execute().text
其他提示
在execute()方法可用于如果与“CMD / C”命令前缀它改变目录,然后用符号(假定视窗),以链的命令一起。
例如,假如你想去子目录的子目录的,并且运行了几个批处理文件:
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”的输入和输出。任何你发送给它就会采取行动,就好像您键入它变成一个壳,而外壳的所有的输出将提供给你。
我裹着这一切在一个封闭,这样你可以这样做:
cmd("cd \\ \n dir ") { if(it.contains("AUTOEXEC.BAT")) println it; return true; }
要得到一个显示器,其仅示出了AUTOEXEC.BAT线。需要注意的是,直到你从封闭返回true,该进程的标准输入可用,因此你可以发送多行文字,并用它无限互动。
我用它颇有几分,因为像“CD”和命令“目录”不与.execute(窗口工作),所以一个简单的:
def directoryListing=cmd("cd\\\ndir")
将得到我一个快速目录轻松上市。