2010-02-04 1 views
3

Я пытаюсь использовать cmd.exe для поиска файла в определенном каталоге, а затем отобразить путь в java-программе и записать его в файл. Проблема в том, что процесс никогда не заканчивается.Команда CMD.exe в java не заканчивается

Вот мой код:

String[] str = new String[] { "cmd.exe ", "cd c:\\", 
         " dir /b /s documents", "2>&1" }; 

      Runtime rt = Runtime.getRuntime(); 
      try{ 

       Process p = rt.exec(str); 
       InputStream is =p.getInputStream(); 
       InputStreamReader in = new InputStreamReader(is); 


       StringBuffer sb = new StringBuffer(); 
       BufferedReader buff = new BufferedReader(in); 
       String line = buff.readLine(); 
       while(line != null) 
       { 
        sb.append(line + "\n"); 
        line = buff.readLine(); 
       } 
       System.out.println(sb); 
       File f = new File("test.txt"); 
       FileOutputStream fos = new FileOutputStream(f); 
       fos.write(sb.toString().getBytes()); 
       fos.close(); 

      }catch(Exception ex) 
      { 
       ex.printStackTrace(); 
      } 

ответ

1

Пожалуйста, попробуйте

cmd /c 

вместо того, чтобы просто

cmd 

Reference

+0

Я должен установить cmd/c вместо cmd.exe как команду в str? Если это так, я попробовал это и получил IOException. Система не может найти указанный файл. – chama

+0

Вы должны поместить '/ c' в отдельный параметр. Runtime.exec ("cmd.exe", "/ c", ...) – tangens

+0

cmd.exe с параметром/c, поэтому ваш код читает: 'String [] str = new String [] {" cmd.exe ", «/ c», «\» cd c: \\ && dir/b/s documents \ ""}; «Я не могу сказать, работает ли это, но это было бы тангенсом :) Обратите внимание, что несколько команд должен быть разделен символом '&&' и заключен в "". –

1

Runtime.exec не работа так. Вы не можете передать несколько команд, подобных этому в cmd.exe.

Runtime.exec позволяет выполнить один процесс со списком аргументов. Он не предоставляет никаких операций с «оболочкой» (например, 2>&1). Вы должны сделать это перенаправление IO самостоятельно, используя потоки ввода/вывода.

Это похоже на вызов функции другой программы main.

Вы можете попробовать: Runtime.exec (новая строка [] {"cmd.exe", "/ c", "dir", "C: \\"});

Но в действительности, если вы хотите, чтобы списки файлов, вам гораздо лучше использовать объекты класса java.io.File, которые не будут зависеть от конкретных функций операционной системы.

0

Вы должны использовать команду start в дополнение к процессу cmd.exe с переключателем/C или/K ПЕРЕД стартовой командой. Пример: для преобразования интерпретатора команд Windows в консоль bash (из mingw prroject) вы должны вызвать метод exec класса Runtime с помощью команды «C: \ Windows \ System32 \ cmd.exe/C start C: \ mingw \ msys \ 1.0 \ bin \ bash.exe "(я использую внешнюю команду, а не внутреннюю, потому что она более значимая, но вы можете использовать внутреннюю команду, такую ​​как DIR и т. д.).