2010-02-04 99 views
3

我試圖使用cmd.exe來搜索特定目錄中的文件,然後在java程序中顯示路徑並將其寫入文件。問題是這個過程永遠不會終止。Java中的CMD.exe命令沒有終止

這裏是我的代碼:

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 2010-02-04 15:15:10

+0

你必須把'/ c'放在一個單獨的參數中。 Runtime.exec(「cmd.exe」,「/ c」,...) – tangens 2010-02-04 15:29:08

+0

帶參數/ c的cmd.exe,以便您的代碼讀取:String [] str = new String [] {「cmd.exe」, 「/ c」,「\」cd c:\\ && dir/b/s documents \「」};'這是否工作我不能說,但那將是tangens的意思:)請注意,多個命令需要用'&&'分隔,並用「」括起來。 – 2010-02-04 15:35:25

1

Runtime.exec不這樣工作。你不能像cmd.exe那樣傳遞多個命令。

Runtime.exec允許您使用參數列表執行單個進程。它不提供任何「外殼」操作(例如2>&1)。您必須使用輸入/輸出流自己執行那種IO重定向。

這與調用另一個程序的main函數類似。你可以嘗試`Runtime.exec(new String [] {「cmd.exe」,「/ c」,「dir」,「C:\\」});

但是實際上,如果你想要文件列表,你最好使用java.io.File類中的設備,它不依賴於操作系統特定的功能。

0

除了使用啓動命令之前的/ C或/ K開關執行cmd.exe過程外,還必須使用start命令。示例:要在bash控制檯(來自mingw prroject)中轉換Windows的命令解釋器,必須使用命令「C:\ Windows \ System32 \ cmd.exe/C start C:\ mingw \ msys \ 1.0 \ bin \ bash.exe「(我使用外部命令而不是內部命令,因爲它比較明顯,但可以使用DIR等內部命令)。