2015-12-29 4 views
0

Я застрял, пытаясь запустить командную команду оболочки из скрипта Groovy. Это была одна из тех команд, где вы разделяете «& &», так что вторая команда никогда не запускается, если 1-й из них не работает. По какой-то причине я не мог заставить его работать. Я использую:Запустите команду составной оболочки из Java/Groovy

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

Оболочка хранится искажая команду метание ошибки, такие как «Изготовленная ЦМД -f недопустимый параметр» Это было похоже на то игнорировал «& &» между ними. Я тоже пытался использовать полуточку, но не повезло. Я попытался использовать прямые Java-API Runtime.getRuntime(). Exec() и разбить команду на массив. Я попробовал обернуть команду в одинарных кавычках и присвоить ей/bin/sh -c, но ничего не работает.

Как выполнить команду командной оболочки с Java? Я знаю, что делал это в прошлом, но сегодня я не могу понять.

+0

Возможно, вам нужно избежать &&. –

+1

Возможный дубликат [как правильно вызвать команды оболочки из правильного набора] (http://stackoverflow.com/questions/12512919/how-to-call-shell-commands-from-groovy-correctly). вы не можете использовать «shellism», как && <| как команды. используйте '-c' и передайте его как _one_ param (проще всего сделать строковый массив, если цитата становится сложной) – cfrick

ответ

0

Try что-то вроде:

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

EDIT:

Вы пробовали использовать 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

С заводной, список форм выполнения должны работать:

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

Смежные вопросы