Groovy:读取然后写入交互式过程

时间:2019-05-08 11:35:19

标签: groovy

我开始认为我的搜索技能不足。

我试图找到有关如何使用Groovy的任何文章,以打开一个交互式过程,读取其输出,然后根据输出文本将其写入该过程。我所能找到的就是如何打印,读取和写入文件。没什么要写一个交互式过程的。

  • 该过程要求输入密码
  • 写密码进行处理

如果可能的话,如下所示:

def process = "some-command.sh".execute()
process.in.eachLine { line ->
    if (line.contains("enter password")) {
      process.out.write("myPassword")
    }
}


这可以从过程输出中读取:

def process = "some-command.sh".execute()
process.in.eachLine { line ->
    println line
}

尽管在进程要求输入时它会停止。它不会打印出问题所在的行。

编辑:找出为什么不打印带有询问密码的行。这不是一条新线。问题是简单的印刷品(不是println)。当没有新行时,我该如何阅读?

有人告诉我期望可以使用,但是我正在寻找不需要依赖项的解决方案。

1 个答案:

答案 0 :(得分:0)

1.bat

@echo off
echo gogogo
set /P V=input me:
echo V=%V%

此脚本在:之后等待输入

gogogo
input me:

这意味着eachLine没有为input me触发,因为之后没有new line

无论如何,前一行gogogo都会被捕获

及以下脚本适用于gogogo,但不适用于input me

常规

def process = "1.bat".execute()
process.in.eachLine { line ->
    if (line.contains("gogogo")) {
        process.out.write("myPassword\n".getBytes("UTF-8"))
        process.out.flush()
    }
}

groovy2

可能可以优化。.以下脚本无需换行即可工作:

def process = "1.bat".execute()
def pout = new ByteArrayOutputStream()
def perr = new ByteArrayOutputStream()

process.consumeProcessOutput(pout, perr) //starts listening threads and returns immediately
while(process.isAlive()){
    Thread.sleep(1234)
    if(pout.toString("UTF-8").endsWith("input me:")){
        process.out.write("myPassword\n".getBytes("UTF-8"))
        process.out.flush()
    }
}