Как выполнить команды cmd через Java
Я пытаюсь выполнить аргументы командной строки через Java. Например:
// Execute command
String command = "cmd /c start cmd.exe";
Process child = Runtime.getRuntime().exec(command);
// Get output stream to write from it
OutputStream out = child.getOutputStream();
out.write("cd C:/ /r/n".getBytes());
out.flush();
out.write("dir /r/n".getBytes());
out.close();
Вышеупомянутая команда открывает командную строку, но не выполняет cd
или dir
. Есть идеи? Я запускаю Windows XP, JRE6.
(Я уточнил свой вопрос, чтобы быть более конкретным. Следующие ответы были полезны, но не отвечали на мой вопрос.)
Ответы
Ответ 1
Введенный вами код запускает три разных процесса, каждый из которых имеет свою собственную команду. Чтобы открыть командную строку, а затем запустите команду, попробуйте следующее (никогда не пробовали это самостоятельно):
try {
// Execute command
String command = "cmd /c start cmd.exe";
Process child = Runtime.getRuntime().exec(command);
// Get output stream to write from it
OutputStream out = child.getOutputStream();
out.write("cd C:/ /r/n".getBytes());
out.flush();
out.write("dir /r/n".getBytes());
out.close();
} catch (IOException e) {
}
Ответ 2
Я нашел это на forums.oracle.com
Позволяет повторному использованию процесса выполнять несколько команд в Windows: http://kr.forums.oracle.com/forums/thread.jspa?messageID=9250051
Вам нужно что-то вроде
String[] command =
{
"cmd",
};
Process p = Runtime.getRuntime().exec(command);
new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());
stdin.println("dir c:\\ /A /Q");
// write any other commands you want here
stdin.close();
int returnCode = p.waitFor();
System.out.println("Return code = " + returnCode);
Класс SyncPipe:
class SyncPipe implements Runnable
{
public SyncPipe(InputStream istrm, OutputStream ostrm) {
istrm_ = istrm;
ostrm_ = ostrm;
}
public void run() {
try
{
final byte[] buffer = new byte[1024];
for (int length = 0; (length = istrm_.read(buffer)) != -1; )
{
ostrm_.write(buffer, 0, length);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private final OutputStream ostrm_;
private final InputStream istrm_;
}
Ответ 3
Если вы хотите запустить несколько команд в командной строке cmd, вы можете создать одну команду следующим образом:
rt.exec("cmd /c start cmd.exe /K \"cd c:/ && dir\"");
Эта страница объясняет больше.
Ответ 4
Каждое выполнение exec
порождает новый процесс со своей собственной средой. Таким образом, ваш второй вызов никак не связан с первым. Он просто изменит свой собственный рабочий каталог, а затем выйдет (т.е. Эффективно не работает).
Если вы хотите создавать запросы, вам нужно сделать это за один раз до exec
. Bash позволяет указать несколько команд в одной строке, если они разделены точкой с запятой; Windows CMD может разрешить одно и то же, а если нет, то всегда есть пакетные скрипты.
Как говорит Петр, если этот пример на самом деле является тем, чего вы пытаетесь достичь, вы можете выполнять одно и то же гораздо более эффективно, эффективно и безопасно с платформой следующее:
String[] filenames = new java.io.File("C:/").list();
Ответ 5
Попробуйте
Вы не используете "cd", чтобы изменить каталог, из которого запускаются ваши команды. Вам нужен полный путь к исполняемому файлу, который вы хотите запустить.
Кроме того, перечисление содержимого каталога проще сделать с классами File/Directory
Ответ 6
Каждый из вызовов exec вызывает процесс. Второй и третий вызовы не выполняются в том же процессе обработки оболочки, который вы создаете в первом. Попробуйте положить все команды в летучую мышь script и запустить ее за один вызов:
rt.exec("cmd myfile.bat");
или аналогичный
Ответ 7
Это потому, что каждый runtime.exec(..)
возвращает класс Process
, который должен использоваться после выполнения вместо этого, вызывая другие команды классом Runtime
Если вы посмотрите Process doc, вы увидите, что вы можете использовать
-
getInputStream()
-
getOutputStream()
на котором вы должны работать, отправляя последовательные команды и извлекая результат.
Ответ 8
Запись в выходной поток из процесса - неправильное направление. "выход" в этом случае означает от вас процесс. Попробуйте получить/записать во входной поток для процесса и прочитать из выходного потока, чтобы увидеть результаты.
Ответ 9
Так же, как и я столкнулся с той же проблемой, и потому, что некоторые люди здесь прокомментировали, что решение для них не работает, вот ссылка на сообщение, где найдено рабочее решение.
fooobar.com/info/145898/...
Также см. "Обновление" в лучшем ответе на использование терминала Cygwin