2010-02-04 64 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等内部命令)。