2011-01-14 3 views
35

Возможно ли открыть командную строку (и, я думаю, любой другой терминал для других систем), и выполнить команды во вновь открывшемся окне?Как открыть командную строку и вставить команды с помощью Java?

В настоящее время, что у меня есть это:

Runtime rt = Runtime.getRuntime(); 
rt.exec(new String[]{"cmd.exe","/c","start"}); 

Я попытался добавить следующую команду после того, как «начать», я попытался запустить другую rt.exec, содержащий мою команду, но я не могу найти способ заставить его работать.

Если это имеет значение, я пытаюсь выполнить команду, подобную этой:

java -flag -flag -cp terminal-based-program.jar 

EDIT К сожалению, у меня были какие-то странные выводы. Мне удалось успешно запустить командную строку и выполнить команду:

rt.exec("cmd.exe /c start command"); 

Однако, похоже, что это работает только с одной командой. Потому что, если я попытаюсь использовать разделитель команд следующим образом: «cmd.exe/c start command & command2», вторая команда передается через фон (как это было бы, если бы я просто использовал rt.exec («command2») ;). Теперь проблема заключается в том, что я понял, что мне нужно изменить каталог, в котором запущена командная строка, потому что, если я просто использую полный путь к файлу jar, файл jar неправильно считывает данные из активного каталога командной строки, а не каталог jar, который содержит его ресурсы.

+1

Не могли бы вы пояснить, почему вы пытаетесь это сделать, а не просто запускать .exec в команде java. Окно команды откроется автоматически. –

+0

См. Комментарий, на который я положил ответ ktm5124. –

ответ

20

Я знаю, что люди рекомендуют держаться подальше от rt.exec (String), но это работает, и я не знаю, как изменить его на версию массива.

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\""); 
+0

Я работаю над чем-то похожим на то, что вы есть, и мне любопытно, откуда взялись/c и/k. Я не могу найти упоминания о них для cmd. Кроме того, почему вы избегаете кавычек? Это потому, что значения между ними представляют собой команду, которая должна быть передана в CMD? – Ungeheuer

+2

'cmd /?' '/ C Выполняет команду, указанную строкой, а затем завершает /K Выполняет команду, указанную строкой, но остается –

3

Следующие работы для меня на Snow Leopard:

Runtime rt = Runtime.getRuntime(); 
String[] testArgs = {"touch", "TEST"}; 
rt.exec(testArgs); 

Дело в том, если вы хотите, чтобы прочитать вывод этой команды, вы должны читать входной поток процесса. Например,

Process pr = rt.exec(arguments); 
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

Позволяет вам легко читать линейный вывод команды.

Проблема также может заключаться в том, что MS-DOS не интерпретирует ваш порядок аргументов как означающий «начать новую командную строку». Ваш массив, вероятно, следует:

{ «Пуск», «cmd.exe», «\ C»}

Чтобы открыть окно команд в новой командной строке, вы должны использовать ссылку процесса. Но я не уверен, почему вы хотите сделать это, когда можете просто использовать exec, как прокомментировал человек, который передо мной.

+0

Причина, по которой я хочу открыть команды в новой командной строке, заключается в том, что программа, которую я пытаюсь запустить, представляет собой консольную программу с входными и выходными данными, поступающими и идущими на консоль соответственно. Обратите внимание: программа, которую я пытаюсь запустить, не та, которую я создал, поэтому мне нужно программировать на основе того, как она работает, я не могу ее изменить. –

6

Если вы работаете две команды сразу просто изменить каталог командной строки работает в, есть перегрузка для метода Runtime.exec, который позволяет указать текущий рабочий каталог. Например,

Runtime rt = Runtime.getRuntime(); 
rt.exec("cmd.exe /c start command", null, new File(newDir)); 

Это откроет командную строку в каталоге на newDir. Я думаю, что ваше решение работает, но это удерживает вашу командную строку или массив немного чище.

Существует перегрузка для команды в виде строки и имеющая команду в виде массива String.

Возможно, вам будет еще проще использовать ProcessBuilder, который имеет метод directory, чтобы установить текущий рабочий каталог.

Надеюсь, это поможет.

+0

, она должна быть runtime.exec (" cmd.exe/c start " , null, new File (newDir)); – ChanGan

+1

Я использовал это, String newDir = "C: \\ Test \\ Application \\"; runtime.exec ("cmd.exe/c start dir", null, new File (newDir)); в этой папке, если я хочу запустить некоторую команду, C: \ Test \ Application \ avt install - filename .. как это сделать ?? ты можешь мне помочь? – ChanGan

8
public static void main(String[] args) { 
    String[] arg = new String[]{"-u root", "-h localhost"}; 

    try { 
     String ss = null; 
     Runtime obj = null; 
     Process p = Runtime.getRuntime().exec("cmd.exe /c start dir "); 
     BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
     writeer.write("dir"); 
     writeer.flush(); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
     System.out.println("Here is the standard output of the command:\n"); 
     while ((ss = stdInput.readLine()) != null) { 
      System.out.println(ss); 
     } 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((ss = stdError.readLine()) != null) { 
      System.out.println(ss); 
     } 

    } catch (IOException e) { 
     System.out.println("FROM CATCH" + e.toString()); 
    } 

} 
+7

Вы можете удалить ненужные комментарии из своего кода и добавить некоторые релевантные. –

1

Просто добавьте команду после запуска в строке, которую вы передаете.

Строка command = "cmd.exe/c start" + "ваша команда";

Процесс child = Runtime.getRuntime(). Exec (команда);

0

Поместите свою команду в параметр, как указано ниже.

Runtime.getRuntime(). Exec ("cmd.exe/c start cmd/k \" параметр \ "");

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