Выполнять команды 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?
- Как установить classpath при использовании javax.tools.JavaCompiler скомпилировать исходный код?
- Массив Java, поиск дубликатов
- Как использовать команду «cd» с использованием времени выполнения Java?
- Как добавить тип в белый список политики сериализации GWT?
- annotations, чтобы сделать приватный метод общедоступным только для тестовых classов
Может ли кто-нибудь помочь мне понять это … как я могу создать каталог, такой как:
cd C:\Program Files\Flowella
затем выполните другие команды в этом каталоге.
- Eclipse Java; экспортная банка, include ссылки на библиотеки, без fatjar
- Является ли метод ссылки кэширования хорошей идеей в Java 8?
- В Java это результат добавления двух символов int или char?
- Spring Boot перенаправляет HTTP на HTTPS
- Хорошо ли использовать java.lang.String.intern ()?
- Hibernate Annotations - Что лучше, поле или доступ к собственности?
- Запрос SOAP для WebService с помощью java
- Чтение целых текстовых файлов из сжатия в Spark
Один из способов запустить процесс из другого каталога в рабочий каталог вашей программы 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();
Здесь вы можете найти больше примеров.