用groovy脚本进行每日工作的自动化【groovy】

摘要:
我们可以使用groovy编写日常批处理脚本,例如windows下的bat或unix下的shell。具体的写作方法很简单。例如,如果我们想执行dir命令,只需要编写一个test.groovy。内容是:println'cmd/cdir'。execute()。text因为dir命令在cmd命令中,所以我们需要使用cmd/c来调用它。以下命令用于特定的执行:groovytest.groovy,以便显示当前目录的内容。在groovy中,只需在字符串之后调用execute方法即可执行字符串中的命令。当然,前提条件是字符串是相应平台上的可执行命令。你觉得这很简单吗。

我们可以用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)

 

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

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

免责声明:文章转载自《用groovy脚本进行每日工作的自动化【groovy】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ogg初始化抽取的快速配置方法一: 将存量数据落地为标准trail数值分析笔记(3)——数值计算中的原则下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Gradle 自定义插件

使用版本 5.6.2 插件被用来封装构建逻辑和一些通用配置。将可重复使用的构建逻辑和默认约定封装到插件里,以便于其他项目使用。 你可以使用你喜欢的语言开发插件,但是最终是要编译成字节码在 JVM 运行的。 Gradle 有两种插件,脚本插件和二进制插件。 关于插件的介绍,可以参考我的另一篇文章 Gradle 插件 这里讲的自定义插件是二进制插件,二进制插...

Use Eclipse to develop groovy[docs.codehaus.org]

http://docs.codehaus.org/display/GROOVY/Install+Groovy-Eclipse+Plugin http://docs.codehaus.org/display/GROOVY/Create+Your+First+Groovy+Project Groovy-Eclipseis the set of Eclipse...

groovy-输入输出

Groovy为I/O提供了一系列的helper methods ,所有的这些方法都适用于标准的 Java Reader/Writer ,InputStream/OutputStream 和File 以及URL classes. 闭包的使用可以确保资源被正确的关闭,比如遍历文件的每一行可以使用下面的代码: 1 new File("foo.txt").ea...

Groovy动态添加方法和属性及Spock单测

在最近的一边学习一边复习的过程中,发现了很多有意思的事情。今天就分享一个groovy.lang.MetaClass应用:如何运行中,动态给类和对象增加属性和添加方法。 对于Java、Groovy来讲,如果用到一个类,那么这个类的属性和方法已经是固定的,可是随着我的学习,发现这个常识并不靠谱。下面开始我的表演。 添加对象方法 下面是简化的语法object.m...

【java web】java运行预编译Groovy脚本

在JVM中执行Groovy类有两种方式: 使用Groovy编译全部的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类载入器来载入这些类。 通过groovy类载入器在执行时直接载入*.groovy文件并生成对象。在这样的方式下,没有生成不论什么*.class,可是生成了一个java.lang.C...

用Groovy读取本地文件的代码

下面这些包默认已经被导入了,不需要使用import再次显式导入: java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.* Groovy的运行时方法调用抉择 运行时,Groovy根据...