Подтвердить что ты не робот

Как открыть командную строку и вставить команды с помощью 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, который содержит его ресурсы.

4b9b3361

Ответ 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();