2009-08-26 134 views
6

爲了讓我的設置更接近「一鍵式部署」,我想使用groovy腳本來啓動/停止由bat腳本控制的其他進程,這些腳本運行在文件系統的不同部分中,以及即使在不同的機器上。從Groovy運行腳本

如何執行這些腳本以及如何從各自的工作目錄中執行這些腳本?

我知道Java的

java.lang.Runtime's exec() 

但是有很多的問題,這個我不知道,如果Groovy中有某種速記的這個呢?

謝謝!

回答

11

Groovy中添加了一個execute()方法,以普通的舊字符串,那麼試試這個:

println "ls -la".execute().text 
+0

我仍然不確定要改變工作目錄。 – 2009-08-26 13:35:56

+0

到目前爲止感謝!很喜歡它! – raoulsson 2009-08-26 13:46:33

9

的execute()方法可以使用,如果你用「CMD/C」命令前綴它改變目錄,然後使用&符號(假設Windows)將命令鏈接在一起。

例子,假設你想去子目錄子目錄並從那裏運行一對夫婦的批處理文件:

如果
println "cmd /c cd subdir & batch1.bat & batch2.bat".execute().text 

不知道有沒有更好的辦法,但這樣做的工作。

1

您還可以使用的ProcessBuilder是在Java中引入了一個令人驚訝的convienent Java類5

的ProcessBuilder讓你

  • 確定工作目錄
  • 確定環境變量的過程中應該有

查看http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html瞭解一個簡要示例和更多文檔。

+0

我第二。這是[一篇博文](http://www.joergm.com/2010/09/executing-shell-commands-in-groovy/),它結合了Groovy和ProcessBuilder – FabienB 2015-01-27 13:45:26

0

如果您不害怕創建一些可重用的代碼,您可以創建一個包裝.execute()過程的對象。我創建了這樣的東西並定期使用它。

創建一個新的流程:

高清proc等於 「CMD」 .execute()

後,您可以使用 「consumeProcessOutput()」 來管理 「過程」 的輸入和輸出。您發送給它的任何內容都將按照您輸入到外殼中的方式進行操作,並且該外殼的所有輸出都將可供您使用。

我裹着這一切在一個封閉,這樣你可以這樣做:

 
cmd("cd \\ \n dir ") { 
    if(it.contains("AUTOEXEC.BAT")) 
     println it; 
    return true; 
} 

爲了得到一個顯示器只顯示AUTOEXEC.BAT線。請注意,除非您從閉包中返回true,否則該過程的標準輸入可用,因此您可以發送更多行文本並無限期地與其交互。

我用它頗有幾分,因爲像「CD」和命令「目錄」不與.execute(窗口工作),所以一個簡單的

 
def directoryListing=cmd("cd\\\ndir") 

會得到我一個快速目錄列表輕鬆。