Как открыть командную строку и вставить команды с помощью Java?
Можно ли открыть командную строку (и, я думаю, любой другой терминал для других систем), и выполнить команды во вновь открывшемся окне?
В настоящее время у меня есть следующее:
Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});
Я попытался добавить следующую команду после "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
Я знаю, что люди рекомендуют держаться подальше от rt.exec(String), но это работает, и я не знаю, как изменить его в версии массива.
rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
Ответ 2
Если вы одновременно запускаете сразу две команды, чтобы изменить каталог, в котором запускается командная строка, существует перегрузка для метода Runtime.exec, который позволяет указать текущий рабочий каталог. Как,
Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));
Откроется окно командной строки в каталоге newDir. Я думаю, что ваше решение работает, но это удерживает вашу командную строку или массив немного чище.
Существует перегрузка для команды в виде строки и имеющая команду в виде массива String.
Однако вам может показаться еще проще использовать ProcessBuilder, который имеет метод directory
, чтобы установить текущую работу каталог.
Надеюсь, что это поможет.
Ответ 3
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());
}
}
Ответ 4
Следующие работы для меня на 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 не интерпретирует ваш порядок аргументов как означающий "начать новую командную строку". Вероятно, ваш массив должен быть:
{ "start", "cmd.exe", "\ c" }
Чтобы открыть команды в новой командной строке, вам нужно будет использовать ссылку Process. Но я не уверен, почему вы хотите сделать это, когда можете просто использовать exec, как прокомментировал человек до меня.
Ответ 5
Вам просто нужно добавить свою команду после запуска в строку, которую вы передаете.
String command = "cmd.exe /c start "+"*your command*";
Process child = Runtime.getRuntime().exec(command);
Ответ 6
Пожалуйста, поместите вашу команду в параметр, подобный указанному ниже.
Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
Ответ 7
Вы можете использовать любой процесс для динамического пути в командной строке
Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\rakhee\\Obligation Extractions\" && dir");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\oxyzen-workspace\\BrightleafDesktop\\Obligation Extractions\" && dir");
Ответ 8
Вы должны тщательно установить все \"
(кавычки). Параметр \k
используется, чтобы оставить командную строку открытой после выполнения.
1) для объединения 2 команд используйте (например, pause
и ipconfig
)
Runtime.getRuntime()
.exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());
2) показать содержимое файла (MORE
- средство просмотра командной строки в Windows)
File selectedFile = new File(pathToFile):
Runtime.getRuntime()
.exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());
Одна вложенная кавычка\"для команды и имени файла, вторая кавычка \" для самого имени файла, для пробелов и т.д., В частности, в имени.
Ответ 9
String[] command = {"cmd.exe" , "/c", "start" , "cmd.exe" , "/k" , "\" dir && ipconfig
\"" };
ProcessBuilder probuilder = new ProcessBuilder( command );
probuilder.directory(new File("D:\\Folder1"));
Process process = probuilder.start();