2010-11-11 4 views
37

Я пытаюсь выполнить аргументы командной строки через Java. Например:Как выполнить команды cmd через 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.

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

+0

Джо, если вы все еще чувствуете, что ваш вопрос не был дан ответ, я думаю, вы должны предоставить больше фона. Мой ответ определенно делает то, что вы хотите достичь, а именно список файлов в C: \. Ответы Винсента и Карлеса показывают вам, как запускать несколько команд оболочки из одного вызова 'exec()'. Я не уверен, чего вы не удовлетворены на данный момент. –

ответ

3

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

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) { 
} 
+4

Спасибо. Это открывает командную строку, но не выполняет команду cd или dir. – joe

+57

Gee, мне нравятся фрагменты кода с отказом от ответственности: «Никогда не пробовал сам». > _ < –

+4

Это открывает командную строку, но не выполняет команду cd или dir, почему? –

2

Попробуйте link

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

Кроме того, список содержимого каталога проще сделать с файлом/каталогом классов

+0

ответ полностью упустил вопрос –

+0

Ответ не связан с вопросом –

1

Каждый из ваших EXEC вызовов создает процесс. Второй и третий вызовы не выполняются в том же процессе обработки оболочки, который вы создаете в первом. Попробуйте поместить все команды в летучей мыши сценария и запустить его в одном вызове: rt.exec("cmd myfile.bat"); или аналогичного

+0

Ответ не имеет отношения к коду вопроса - нет «другого» вызова exec –

+2

Был, когда я ответил, но вопрос был отредактирован с тех пор. Пожалуйста, просмотрите историю изменений для этого вопроса до начала опроса. –

3

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

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

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

String[] filenames = new java.io.File("C:/").list(); 
+0

@Boris - проверьте историю вопроса, он был отредактирован за два месяца с тех пор, как я опубликовал этот ответ. –

15

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

rt.exec("cmd /c start cmd.exe /K \"cd c:/ && dir\""); 

This page объясняет больше.

0

Это потому, что каждый runtime.exec(..) возвращает Process класса, который должен использоваться после выполнения вместо этого, ссылающихся на другие команды по Runtime классу

Если вы посмотрите на Process doc вы увидите, что вы можете использовать

  • getInputStream()
  • getOutputStream()

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

0

Запись в выходной поток из процесса в неправильном направлении. «выход» в этом случае означает от вас процесс. Попробуйте получить/записать во входной поток для процесса и прочитать из выходного потока, чтобы увидеть результаты.

61

Я нашел это в 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_; 
} 
+1

Это на самом деле правильный ответ, который работает! –

+4

Отлично, что ссылка недействительна, но кодов, скопированных здесь, достаточно. – mrmoment

+0

Работает! Отлично! спасибо –

0

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

https://stackoverflow.com/a/24406721/3751590

см также «Обновить» в лучший ответ для использования Cygwin терминалу