我们可以用groovy编写日常的批处理脚本,类似windows下的bat或者unix下的shell。其具体的编写方式非常简单,比如我们想要执行一个dir的命令,只要编写一个test.groovy,其中内容为:

println 'cmd /c dir'.execute().text

因为dir这个命令是在cmd命令中的,因此需要用cmd /c来进行调用。

具体执行就用类似如下的命令来执行:

groovy test.groovy

这样就能显示出当前目录下的内容了。

在groovy中只要把字符串后面调用execute方法就能执行字符串中的命令,当然前提条件是这个字符串是相应平台上的可执行命令,是否觉得很简单。

在我的一个需求中,需要能够切换到指定路径下执行相应的命令,因此需要有一个类似切换路径的需求,或者说需要在指定路径下执行某命令,类似实现如下:

println 'cmd /c dir'.execute(null, new File("D:\\project\\mystudy2")).text

这样上述的命令就能打印出某路径下的文件信息了。

这个字符串中能够执行相应的进程背后的核心就是调用JAVA中的Runtime.exec方法。

在进程处理中,有时我们需要等待进程执行完成之后才能进行下面的操作,这个实现如下所示:

def proc = 'cmd /c dir'.execute()

proc.waitFor()

println proc.text

上面waitFor函数是永久等待,如果想要等待一段时间的用:

proc.waitForOrKill(1000)

其中的时间是毫秒为单位。

进程中的输入输出流以及错误流可以通过如下的方法获得:

InputStream in = proc.in
InputStream err = proc.err
OutputStream out = proc.out

其实,我们上面proc的类型就是java中的java.lang.Process类,大家可以参考这个类中的具体方法。

需要注意的是如果有的进程在执行过程中有大量的内容输出,而程序没有把输出缓冲区中的内容取走,会使这个进程给block住而不执行。

要把输出缓冲区中的内容取走,可以参考如下:

def inputStream = new InputStreamReader(proc.errorStream)
BufferedReader bufferedReader = new BufferedReader(inputStream)
while (true){
String s = bufferedReader.readLine()
if (s == null){
break
}
} proc.waitFor()

还有类似的获取输出内容的方法如下所示:

def outputBuffer = new StringBuffer()
def errorBuffer = new StringBuffer()
zipProcess = 'gzip -c'.execute()
unzipProcess = 'gunzip -c'.execute()
unzipProcess.consumeProcessOutput(outputBuffer, errorBuffer)
zipProcess.consumeProcessErrorStream(errorBuffer)

欢迎在自己的日常工作中对一些工作进行自动化。

程序员就是让机器为自己干活。

最新文章

  1. 关于 Raphael
  2. ARM 编译 phddns
  3. android radiogroup样式(设置切换背景与文字颜色)
  4. asp.net GDI+绘制五边形
  5. git 教程(5)--工作区和暂存区
  6. Q114第一颗二叉查找树(链式)
  7. 通过微信查找SAP TCODE代码
  8. 取消chrome浏览器下input和textarea的默认样式
  9. python - PyQuery
  10. 启动TOMCAT报错 java.util.zip.ZipException: invalid LOC header (bad signature)
  11. Apache使用mod_deflate模块压缩页面优化传输速度
  12. CSS下背景属性background的使用方法
  13. X-Scan使用教程
  14. C#打印九九乘法表
  15. 使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API
  16. [Linux]Linux read/write
  17. tensorflow-softmax
  18. 解决 iframe 后退不是主页面后退(浏览器 history)问题
  19. 关于Spring-Data-Jpa的一些理解
  20. vue-resource使用 (vue仿百度搜索)

热门文章

  1. Equivalent Sets HDU - 3836 2011多校I tarjan强连通分量
  2. where 和 having区别
  3. webstorm设置VCS:版本控制顶部按钮
  4. 虚拟机静态ip设置
  5. Centos 6.5 freeswitch 编译mod_shout
  6. Ex 2_4 假定您需要在以下三种算法中作出抉择..._第三次作业
  7. ubuntu安装jdk8
  8. 移动端的dl
  9. 开源框架 ImageLoader +ListView+GridView+RecyclerView 浅解
  10. strchr()