2016-06-06 3 views
0

Я понимаю, что длинный однострочный код ниже выглядит смешно, но, пожалуйста, рассматривайте его как псевдокод. У меня есть скрипт, который выполняет 11 строк команд подряд. Я успешно реализовал его с помощью AutoItX (аналогично Selenium), но это действительно только решение на уровне поверхности. Имитированные нажатия кнопок оставляют место для ошибок и прерываний и просто не чувствуют себя как чистый код. Я хочу, чтобы сама командная строка выполняла сценарий с использованием среды выполнения Java.Как выполнить несколько команд с использованием Java Runtime?

sendCommand("cmd cd " + homepath + "\\" + a + "&&" + "mvn archetype:generate -DarchetypeCatalog=file://"+ homepath + "/.m2/repository" + "&&" + "1" + "&&" + c + "&&" + b + "&&" + c + "&&" + uuid.toString() + "&&" + "Y" + "&&" + "cd " + homepath +"\\"+ a +"\\" + b + "&&" + "mvn clean install" + "&&" + "cd " + homepath +"\\" + a + "&&" + "cd " + homepath +"\\" + a +"\\" + b + "\\" + b + "-plugin" + "\\target" + "&&" + "jar -xvf " + zipDirectory + "&&" + "cmd cd " + homepath +"\\" + a +"\\" + b + "\\" + b + "-plugin" + "\\target\\" + "\\META-INF\\maven\\" + c + "\\" + b + "-plugin" + "&&" + "copy pom.xml " + pluginDirectory + "&&" + "cd " + pluginDirectory + "&&" + "rename pom.xml " + b + "-plugin-1.0.0.pom" + "&&" + "color 0a"); 

private static void sendCommand(String text) throws IOException, InterruptedException { 
    Runtime.getRuntime().exec(text); 
} 

Может ли ProcessBuilder принимать более двух командных строк? Я никогда не видел, чтобы это использовалось раньше. Например, вот две строки:

sendCommand("homepath/plugins", "mvn", "archetype:generate", "-DarchetypeCatalog=file://homepath/.m2/repository"); 

private static void sendCommand(String workingDirectory, String... command) throws IOException { 
    Process proc = new ProcessBuilder(command).directory(new File(workingDirectory)).start(); 
    int status = proc.waitFor(); 
    if (status != 0) { 
     // Handle non-zero exit code, which means the command failed 
    } 
} 

Как я могу запустить 11 строк в том же самом процессе, и выполнять каждый из них только после того, как предыдущая была выполнена?

+0

Запустить командную оболочку и кормить команды к нему с помощью стандартного ввода. – EJP

+0

Вы можете изучить такие инструменты, как http://expectj.sourceforge.net/ (или, может быть, что-то новое) – GhostCat

+0

Почему бы не создать скрипт (например, run_mvn.cmd) со всеми командами и проверками внутри и запустить это через 'ProcessBuilder'? Поскольку это очень специфичная задача для платформы/оболочки, я бы передал всю основную работу в cmd/shell. Потому что они построены для такого случая. – SubOptimal

ответ

0

Создайте файл .vbs, который вызывает командный файл. В пакетном файле напишите все свои команды. Вызовите файл .vbs из процесса.

String ExecutionPath = "pathTo/run.vbs"; 
final Process process = Runtime.getRuntime().exec("wscript " + ExecutionPath); 

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    public void run() { 
     process.destroy(); 
    } 
})); 
process.waitFor(); 

Ваш .vbs-файл выглядит так, что вызывает командный файл, а командная строка, запускающая пакет, не отображается.

дим WinScriptHost

Набор WinScriptHost = CreateObject ("WScript.Shell")

дим oFSO

Набор oFSO = CreateObject ("Scripting.FileSystemObject")

sScriptDir = oFSO. GetParentFolderName (WScript.ScriptFullName)

WinScriptHost.Run Chr (34) & sScriptDir & "\ run.bat" & Chr (34), 0

Набор WinScriptHost = Ничего

+0

Зачем нужен промежуточный файл .vbs? – EJP

+0

Непосредственный запуск командного файла из обработчика процесса вызывает всплывающее окно командной строки. Если вы не хотите, чтобы окно командной строки всплывало, используйте промежуточные vbs. Если cmd window pooping up - это не ваша проблема, тогда напрямую вызывайте свой командный файл. – sudhirk496

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