Выполнять команды cmd через java

Я нашел несколько fragmentов кода для запуска команд cmd через class java, но я не смог его получить. Этот код для открытия cmd

public void excCommand(String new_dir){ Runtime rt = Runtime.getRuntime(); try { rt.exec(new String[]{"cmd.exe","/c","start"}); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

И я нашел другие ссылки для добавления других команд, таких как cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java

Как открыть командную строку и вставить команды с помощью Java?

Может ли кто-нибудь помочь мне понять это … как я могу создать каталог, такой как:

  cd C:\Program Files\Flowella 

затем выполните другие команды в этом каталоге.

Один из способов запустить процесс из другого каталога в рабочий каталог вашей программы Java – это изменить каталог, а затем запустить процесс в той же командной строке. Вы можете сделать это, получив cmd.exe для запуска командной строки, например, cd some_directory && some_program .

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

 import java.io.*; public class CmdTest { public static void main(String[] args) throws Exception { ProcessBuilder builder = new ProcessBuilder( "cmd.exe", "/c", "cd \"C:\\Program Files\\Microsoft SQL Server\" && dir"); builder.redirectErrorStream(true); Process p = builder.start(); BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while (true) { line = r.readLine(); if (line == null) { break; } System.out.println(line); } } } 

Также обратите внимание, что я использую ProcessBuilder для запуска команды. Помимо всего прочего, это позволяет мне перенаправить стандартную ошибку процесса на стандартный вывод, вызвав redirectErrorStream(true) . Это дает мне только один stream для чтения.

Это дает мне следующий результат на моей машине:

 C:\Users\Luke\StackOverflow>java CmdTest Volume in drive C is Windows7 Volume Serial Number is D8F0-C934 Directory of C:\Program Files\Microsoft SQL Server 29/07/2011 11:03  . 29/07/2011 11:03  .. 21/01/2011 20:37  100 21/01/2011 20:35  80 21/01/2011 20:35  90 21/01/2011 20:39  MSSQL10_50.SQLEXPRESS 0 File(s) 0 bytes 6 Dir(s) 209,496,424,448 bytes free 

Вы можете попробовать следующее:

 Process p = Runtime.getRuntime().exec(command); 

Если вы хотите выполнить такие действия, как cd , используйте:

 String[] command = {command_to_be_executed, arg1, arg2}; ProcessBuilder builder = new ProcessBuilder(command); builder = builder.directory(new File("directory_location")); 

Пример:

 String[] command = {"ls", "-al"}; ProcessBuilder builder = new ProcessBuilder(command); builder = builder.directory(new File("/ngs/app/abc")); Process p = builder.start(); 

Важно, чтобы вы разделили команду и все аргументы в отдельных строках массива строк (иначе они не будут корректно ProcessBuilder API ProcessBuilder ).

Мой пример (из реального проекта)

папка – Файл.

zipFile, filesString – String;

  final String command = "/bin/tar -xvf " + zipFile + " " + filesString; logger.info("Start unzipping: {} into the folder {}", command, folder.getPath()); final Runtime r = Runtime.getRuntime(); final Process p = r.exec(command, null, folder); final int returnCode = p.waitFor(); if (logger.isWarnEnabled()) { final BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = is.readLine()) != null) { logger.warn(line); } final BufferedReader is2 = new BufferedReader(new InputStreamReader(p.getErrorStream())); while ((line = is2.readLine()) != null) { logger.warn(line); } } 

Самый простой способ – использовать Runtime.getRuntime.exec() .

Например, чтобы получить значение реестра для браузера по умолчанию в Windows:

 String command = "REG QUERY HKEY_CLASSES_ROOT\\http\\shell\\open\\command"; try { Process process = Runtime.getRuntime().exec(command); } catch (IOException e) { e.printStackTrace(); } 

Затем используйте Scanner для получения вывода команды, если это необходимо.

 Scanner kb = new Scanner(process.getInputStream()); 

Примечание : \ является escape-символом в String и должен быть экранирован для правильной работы (следовательно, \\ ).


Однако не существует исполняемого файла cd , поскольку он не может быть реализован в отдельном процессе.

В одном случае, когда текущая рабочая директория имеет значение, выполняется внешний процесс (с использованием ProcessBuilder или Runtime.exec() ). В этих случаях вы можете указать рабочий каталог, который будет использоваться для вновь запущенного процесса.

Самый простой способ для вашей команды:

 System.setProperty("user.dir", "C:\\Program Files\\Flowella"); 

Как только вы получите ссылку на Process, вы можете вызвать getOutpuStream на нем, чтобы получить стандартный ввод команды cmd. Затем вы можете отправить любую команду над streamом, используя метод write, как с любым другим streamом.

Обратите внимание, что это process.getOutputStream (), который связан с stdin на порожденном процессе. Аналогично, чтобы получить вывод любой команды, вам нужно будет вызвать getInputStream, а затем прочитать это как любой другой входной stream.

Вы не можете запустить cd таким образом, потому что cd не является реальной программой; это встроенная часть командной строки, и все, что она делает, это изменение среды командной строки. Не имеет смысла запускать его в subprocessе, потому что тогда вы меняете среду этого subprocessа, но этот subprocess немедленно закрывается, отбрасывая среду.

Чтобы установить текущий рабочий каталог в вашей реальной программе Java, вы должны написать:

 System.setProperty("user.dir", "C:\\Program Files\\Flowella"); 

Попробуй это:

 Process runtime = Runtime.getRuntime().exec("cmd /c start notepad++.exe"); 

Вот более полная реализация выполнения командной строки.

Применение

 executeCommand("ls"); 

Вывод:

 12/27/2017 11:18:11:732: ls 12/27/2017 11:18:11:820: build.gradle 12/27/2017 11:18:11:820: gradle 12/27/2017 11:18:11:820: gradlew 12/27/2017 11:18:11:820: gradlew.bat 12/27/2017 11:18:11:820: out 12/27/2017 11:18:11:820: settings.gradle 12/27/2017 11:18:11:820: src 

Код

 private void executeCommand(String command) { try { log(command); Process process = Runtime.getRuntime().exec(command); logOutput(process.getInputStream(), ""); logOutput(process.getErrorStream(), "Error: "); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } private void logOutput(InputStream inputStream, String prefix) { new Thread(() -> { Scanner scanner = new Scanner(inputStream, "UTF-8"); while (scanner.hasNextLine()) { synchronized (this) { log(prefix + scanner.nextLine()); } } scanner.close(); }).start(); } private static SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss:SSS"); private synchronized void log(String message) { System.out.println(format.format(new Date()) + ": " + message); } 

Самый простой и короткий путь – использовать библиотеку CmdTool .

 new Cmd() .configuring(new WorkDir("C:/Program Files/Flowella")) .command("cmd.exe", "/c", "start") .execute(); 

Здесь вы можете найти больше примеров.

  • Вывод Big-O для реализации Java Collections Framework?
  • Как получить все имена classов в пакете?
  • Java ассоциативный массив
  • Что такое переменные Shadow в Java?
  • Java - Включая переменные в строки?
  • Почему Double.MIN_VALUE не является отрицательным?
  • Maven не находит тесты JUnit для запуска
  • Шифрование и расшифровка большой строки в java с помощью RSA
  • Извлечь время с даты String
  • Java неизменяемые коллекции
  • Как разрешить ElementNotInteractableException в Selenium webdriver?
  • Interesting Posts

    Как загрузить последние вкладки в Chrome с помощью файлов Last Tabs, Last Session?

    Что нужно делать JVM при вызове метода native?

    Можно ли одновременно выбирать и загружать несколько файлов в Internet Explorer?

    Как заставить excel указывать все столбцы файла CSV?

    Почему внезапно я не могу получить доступ к удаленному SVN?

    Как установить пространство имен XML по умолчанию для XDocument

    Как удалить виртуальный компакт-диск MyBook «WD SmartWare» с моего рабочего стола?

    Какова наилучшая практика для округления поплавка до 2 десятичных знаков?

    Какой раздел реестра или файл Windows определяет, где находятся мониторы в среде с несколькими мониторами?

    HDD в оптическом отсеке вращается вниз и вверх постоянно

    Перехват ссылок из браузера, чтобы открыть приложение для Android

    Если функция не возвращает значение с допустимым типом возвращаемого значения, нормально ли компилятору выкинуть мусор?

    Переназначение ключа AltGr на Windows Key в Windows 7

    rbind dataframes в списке списков

    Транспонирование динамических столбцов в строки

    Давайте будем гением компьютера.