我們可以用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)
歡迎在自己的日常工作中對一些工作進行自動化。
程序員就是讓機器為自己干活。