2015-12-29 155 views
0

我試圖從Groovy腳本運行復合shell命令。這是其中一個命令,您將其與「& &」分開,以便第二個命令在第一個命令失敗時不會運行。無論出於何種原因,我都無法使它工作。我用的是:從Java/Groovy運行復合shell命令

println "custom-cmd -a https://someurl/path && other-cmd -f parameter".execute([], new File('/some/dir')).text 

外殼保持曲解命令拋出類似的錯誤「定製CMD -f選項無效」這就像有人忽略的「& &」。我也嘗試過使用分號,但並不幸運。我嘗試使用直接的Java API Runtime.getRuntime()。exec()並將命令分割成數組。我嘗試在單引號中包裝命令並將其提供給'/ bin/sh -c',但沒有任何效果。

如何從Java運行復合shell命令?我知道我過去做過這件事,但今天我無法弄清楚。

+0

也許你需要轉義&&。 –

+1

[如何正確調用groovy中的shell命令]的可能重複(http://stackoverflow.com/questions/12512919/how-to-call-shell-commands-from-groovy-correctly)。你不能像&& <|那樣使用「shellism」作爲命令。使用'-c'並將其作爲_one_參數傳遞(最簡單的方法是由字符串數組完成,如果引用變得棘手) – cfrick

回答

0

嘗試類似:

Runtime.getRuntime().exec("cmd /c \"start somefile.bat && start other.bat && cd C:\\test && test.exe\"");

Runtime.getRuntime().exec()可以不分割的命令到一個陣列中使用。

https://stackoverflow.com/a/18867097/1410671

編輯:

您是否嘗試過使用ProcessBuilder?這似乎對我的OSX箱的工作:

public static void main(String[] args) throws IOException { 
    ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "echo '123' && ls"); 

    Process p=null; 
    try { 
     p = builder.start(); 
    } 
    catch (IOException e) { 
     System.out.println(e); 
    } 


    Scanner s = new Scanner(p.getInputStream()); 
    while (s.hasNext()) 
    { 
     System.out.println(s.next()); 
    } 
    s.close(); 
} 
+0

如上所述,我已經嘗試過類似的東西。 (我在OSX上)我用/ bin/sh -c'cmd && othercmd' – Cliff

+0

另外,我已經嘗試了拆分而不是拆分cmd。通常在白色空間分割效果更好,但在這種情況下效果不佳。 – Cliff

2

使用Groovy,執行的列表形式應該工作:

def out = ['bash', '-c', "custom-cmd -a https://someurl/path && other-cmd -f parameter"].execute([], new File('/some/dir')).text 

當然,你可能會想使用過程中consumeProcessOutput方法,因爲如果輸出太大,呼叫文本可能會阻止

+0

這個工程!謝謝!當我通過/ bin/sh作爲可執行文件但bash似乎可行時,它不工作。我也不知道List也支持execute方法!太好了! – Cliff