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

Как выполнить команды 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.

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

4b9b3361

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