Java выполнить команду windows

Как с помощью Java выполнить Shell-команду

Обзор

В этом руководстве мы рассмотрим два способа выполнения shell -команд из программы на Java . Первый способ – использовать класс Runtime и вызвать его метод exec . Второй (более гибкий способ) – создать экземпляр класса ProcessBuilder .

Зависимость операционной системы

Сначала нужно определить операционную систему, на которой работает наша JVM . В Windows необходимо запустить команду в качестве аргумента оболочки cmd.exe, а в остальных ОС мы будем использовать стандартную оболочку sh:

Ввод и вывод

Также нужно подключиться к входным и выходным потокам нашего процесса. По крайней мере, нужно получить выходные данные, иначе процесс зависнет.

Реализуем класс StreamGobbler, который использует InputStream :

Примечание. Этот класс реализует интерфейс Runnable , а это означает, что он может быть выполнен любым исполнителем.

Runtime.exec()

Метод Runtime.exec() — это простой, но недостаточно гибкий способ создания нового подпроцесса .

В следующем примере мы запросим список пользователей из локальной директории и выведем его в консоли:

ProcessBuilder

Класс ProcessBuilder является более гибким в использовании, чем Runtime. Он позволяет настраивать целый ряд параметров.

  • изменить рабочий каталог, в котором работает shell-команда,
  • перенаправить потоки ввода и вывода;
  • наследовать их в потоках текущего процесса JVM, используя builder.inheritIO().

Заключение

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

Программные исходники примеров, приведенных в этой статье, доступны на GitHub .

Работа с Java в командной строке

От простого к .

Каждая программа обычно содержится в отдельном каталоге. Я придерживаюсь правила создавать в этом каталоге по крайней мере две папки: src и bin. В первой содержатся исходные коды, во второй — результат компиляции. В данных папках будет структура каталогов, зависящая от пакетов.

Один файл

Можно сделать и без лишних папок.
Берем сам файл HelloWorld.java.
Переходим в каталог, где лежит данный файл, и выполняем команды.
В данной папке появится файл HelloWorld.class. Значит программа скомпилирована. Чтобы запустить

Отделяем бинарные файлы от исходников

Теперь сделаем тоже самое, но с каталогами. Создадим каталог HelloWorld и в нем две папки src и bin.
Компилируем
Здесь мы указали, что бинарные файлы будут сохраняться в отдельную папку bin и не путаться с исходниками.

Используем пакеты

А то, вдруг, программа перестанет быть просто HelloWorld-ом. Пакетам лучше давать понятное и уникальное имя. Это позволит добавить данную программу в другой проект без конфликта имен. Прочитав некоторые статьи, можно подумать, что для имени пакета обязательно нужен домен. Это не так. Домены — это удобный способ добиться уникальности. Если своего домена нет, воспользуйтесь аккаунтом на сайте (например, ru.habrahabr.mylogin). Он будет уникальным. Учтите, что имена пакетов должны быть в нижнем регистре. И избегайте использования спецсимволов. Проблемы возникают из-за разных платформ и файловых систем.

Поместим наш класс в пакет с именем com.qwertovsky.helloworld. Для этого добавим в начало файла строчку
В каталоге src создадим дополнительные каталоги, чтобы путь к файлу выглядел так: src/com/qwertovsky/helloworld/HelloWorld.java.
Компилируем
В каталоге bin автоматически создастся структура каталогов как и в src.

Если в программе несколько файлов

HelloWorld.java
Calculator.java
Adder.java

Ошибка возникла из-за того, что для компиляции нужны файлы с исходными кодами классов, которые используются (класс Calculator). Надо указать компилятору каталог с файлами с помощью ключа -sourcepath.
Компилируем

Если удивляет результат

Есть возможность запустить отладчик. Для этого существует jdb.
Сначала компилируем с ключом -g, чтобы у отладчика была информация.

Читайте также:  Активация windows 10 топ

Отладчик запускает свой внутренний терминал для ввода команд. Справку по последним можно вывести с помощью команды help.
Указываем точку прерывания на 9 строке в классе Calculator

Запускаем на выполнение.

Чтобы соориентироваться можно вывести кусок исходного кода, где в данный момент находится курссор.

Узнаем, что из себя представляет переменная а.

Выполним код в текущей строке и увидим, что sum стала равняться 2.

Поднимемся из класса Adder в вызвавший его класс Calculator.

Удаляем точку прерывания

Можно избежать захода в методы, используя команду next.

Проверяем значение выражения и завершаем выполнение.

Хорошо бы протестировать

Запускаем. В качестве разделителя нескольких путей в classpath в Windows используется ‘;’, в Linux — ‘:’. В консоли Cygwin не работают оба разделителя. Возможно, должен работать ‘;’, но он воспринимается как разделитель команд.

Создадим библиотеку

Класс Calculator оказался полезным и может быть использован во многих проектах. Перенесем всё, что касается класса Calculator в отдельный проект.

Измените также назавания пакетов в исходных текстах. В HelloWorld.java нужно будет добавить строку

Делаем архив jar

С помощью ключа -C мы запустили программу в каталоге bin.

Надо узнать, что у библиотеки внутри

Можно распаковать архив zip-распаковщиком и посмотреть, какие классы есть в библиотеке.
Информацию о любом классе можно получить с помощью дизассемблера javap.

Из результата видно, что класс содержит кроме пустого конструктора, ещё один метод sum, внутри которого в цикле вызывается метод add класса Adder. По завершении метода sum, вызывается Adder.getSum().
Без ключа -c программа выдаст только список переменных и методов (если использовать -private, то всех).

Лучше снабдить библиотеку документацией

Изменим для этого класс калькулятора.

Документацию можно создать следующей командой. При ошибке программа выдаст список возможных опций.

В результате получиться следующее

Можно подписать jar-архив

Если требуется подписать свою библиотеку цифровой подписью, на помощь придут keytool и jarsigner.
Генерируем подпись.

Генерируем Certificate Signing Request (CSR)

Содержимое полученного файла отправляем в центр сертификации. От центра сертификации получаем сертификат. Сохраняем его в файле (например, qwertokey.cer) и импортируем в хранилище

Файл qwertokey.cer отправляем всем, кто хочет проверить архив. Проверяется он так

Использование библиотеки

Есть программа HelloWorld, которая использует библиотечный класс Calculator. Чтобы скомпилировать и запустить программу, нужно присоединить библиотеку.
Компилируем

Собираем программу

Это можно сделать по-разному.

Первый способ

Здесь есть тонкости.
В строке

не должно быть пробелов в конце.
Вторая тонкость описана в [3]: в этой же строке должен стоять перенос на следующую строку. Это если манифест помещается в архив сторонним архиватором.
Программа jar не включит в манифест последнюю строку из манифеста, если в конце не стоит перенос строки.
Ещё момент: в манифесте не должно быть пустых строк между строками. Будет выдана ошибка «java.io.IOException: invalid manifest format».

При использовании команды echo надо следить только за пробелом в конце строки с main-class.

Второй способ

В данном способе избегаем ошибки с пробелом в main-class.

Третий способ

Включили код нужной библиотеки в исполняемый файл.

Запуск исполняемого jar-файла

Файл calculator.jar исполняемым не является. А вот helloworld.jar можно запустить.
Если архив был создан первыми двумя способами, то рядом с ним в одном каталоге должна находится папка lib с файлом calculator.jar. Такие ограничения из-за того, что в манифесте в class-path указан путь относительно исполняемого файла.

При использовании третьего способа нужные библиотеки включаются в исполняемый файл. Держать рядом нужные библиотеки не требуется. Запускается аналогично.

Как быть с приложениями JavaEE

Аналогично. Только библиотеки для компиляции нужно брать у сервера приложений, который используется. Если я использую JBoss, то для компиляции сервлета мне нужно будет выполнить примерно следующее

Структура архива JavaEE-приложения должна соответствовать определенному формату. Например

Способы запуска приложения на самом сервере с помощью командной строки для каждого сервера различны.

Надеюсь, данная статья станет для кого-нибудь шпаргалкой для работы с Java в командной строке. Данные навыки помогут понять содержание и смысл Ant-скриптов и ответить на собеседовании на более каверзные вопросы, чем «Какая IDE Вам больше нравится?».

Читайте также:  Freedom для windows phone

Как выполнять команды cmd через Java

Я пытаюсь выполнить аргументы командной строки через Java. Например:

Вышеприведенное открывает командную строку, но не выполняет cd или же dir , Есть идеи? Я использую Windows XP, JRE6.

(Я изменил свой вопрос, чтобы быть более конкретным. Следующие ответы были полезны, но не отвечаем на мой вопрос.)

9 ответов

Код, который вы разместили, запускает три разных процесса, каждый со своей командой. Чтобы открыть командную строку и затем запустить команду, попробуйте следующее (сам никогда не пробовал):

Я нашел это на forums.oracle.com

Позволяет повторное использование процесса для выполнения нескольких команд в Windows: http://kr.forums.oracle.com/forums/thread.jspa?messageID=9250051

Вам нужно что-то вроде

Если вы хотите запустить несколько команд в оболочке cmd, вы можете создать одну команду, например:

Каждое исполнение exec порождает новый процесс со своей собственной средой. Таким образом, ваш второй вызов никак не связан с первым. Он просто изменит свой рабочий каталог и затем выйдет (т. Е. Фактически он не работает).

Если вы хотите составить запрос, вам нужно сделать это в течение одного вызова exec , Bash позволяет указывать несколько команд в одной строке, если они разделены точкой с запятой; Windows CMD может разрешать то же самое, и если нет, то всегда есть пакетные сценарии.

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

Вы не используете «cd», чтобы изменить каталог, из которого выполняются ваши команды. Вам нужен полный путь к исполняемому файлу, который вы хотите запустить.

Кроме того, составление списка содержимого каталога проще с классами File/Directory.

Выполните команды cmd через Java

Я нашел несколько фрагментов кода для запуска команд cmd через класс Java, но я не смог понять его.

Это код для открытия cmd

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

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

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

13 ответов

У меня есть метод под названием taskkill(), написанный в java. Я хочу реализовать команду cmd taskkill в выбранном поле (как показано на рисунке). Я не знаю, как применить эту команду в java. Пожалуйста, помогите. public static Timer taskkill() < TimerTask timerTask = new TimerTask() < @Override.

я пытаюсь сохранить logcat устройства Android, выполняя команды cmd через java, хотя файл, который я указываю, в котором будет сохранен logcat, никогда не создается. Кто-нибудь может сказать мне, почему это происходит? команда cmd, которую я хочу выполнить, — это adb logcat >.

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

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

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

Это дает мне следующий вывод на моей машине:

Вы можете попробовать это:-

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

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

Я хочу использовать команду netsh через java . Netsh работает только в режиме cmd administartor . Как использовать команды netsh в cmd в режиме администратора через java и сделать специальные сети через командный режим.

Читайте также:  Как запретить удалять ярлыки с рабочего стола windows 10

Я пытаюсь использовать ProcessBuild для выполнения оператора cmd. ProcessBuilder pb = new ProcessBuilder(cmd.exe, /C, start); Process p = pb.start(); Однако я могу открыть только cmd.exe Я не знаю, как добавить оператор к ProcessBuild, чтобы все jar в папке могли работать. Обычно я открываю cmd в.

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

zipFile, filesString — строка;

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

Использование

Выход:

Проще всего было бы использовать Runtime.getRuntime.exec() .

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

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

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

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

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

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

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

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

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

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

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

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

один из способов выполнить cmd из java !

Здесь сумматор значений-это использование амперсандов для пакетных команд и корректного формата для привода изменений с компакт-диском.

Похожие вопросы:

Я пытаюсь выполнить аргументы командной строки через Java. Например: // Execute command String command = cmd /c start cmd.exe; Process child = Runtime.getRuntime().exec(command); // Get output.

У меня есть проблема с CMD в проекте VB.NET, который я делаю. Как я могу ввести три разные команды в одно и то же окно CMD, которое я открываю с помощью кнопки на своей форме? Всякий раз, когда я.

Моя компания должна изменить ключ windows на куче машин, и я хотел бы включить все шаги в сценарий. Чтобы изменить ключ, пока пользователь все еще входит в систему (у них нет прав администратора).

У меня есть метод под названием taskkill(), написанный в java. Я хочу реализовать команду cmd taskkill в выбранном поле (как показано на рисунке). Я не знаю, как применить эту команду в java.

я пытаюсь сохранить logcat устройства Android, выполняя команды cmd через java, хотя файл, который я указываю, в котором будет сохранен logcat, никогда не создается. Кто-нибудь может сказать мне.

Я хочу использовать команду netsh через java . Netsh работает только в режиме cmd administartor . Как использовать команды netsh в cmd в режиме администратора через java и сделать специальные сети.

Я пытаюсь использовать ProcessBuild для выполнения оператора cmd. ProcessBuilder pb = new ProcessBuilder(cmd.exe, /C, start); Process p = pb.start(); Однако я могу открыть только cmd.exe Я не знаю.

Я хочу, чтобы моя программа java делала следующие вещи: Откройте cmd и выполните команды: d:, cd D:\Java Projects\imageProject, screenshot-cmd Я попытался погуглить это и нашел несколько примеров.

Я хочу последовательно запускать несколько команд cmd из кода java одну за другой. Я хочу использовать это одно приложение командной строки, которое создает соединение ssh, и я хочу успешно.

Оцените статью