如何通过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(); 

上面打开命令行但不执行cddir 。 有任何想法吗? 我正在运行Windows XP,JRE6。

(我已经修改了我的问题更具体,下面的答案是有帮助的,但不回答我的问题。)

你发布的代码启动三个不同的进程,每个都有自己的命令。 要打开一个命令提示符,然后运行一个命令,请尝试以下操作(从未尝试过):

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

我在forums.oracle.comfind了这个

允许重用进程在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_; } 

如果你想在cmd shell中运行几个命令,那么你可以像这样构造一个命令:

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

这个页面解释更多。

exec每一次执行都会产生一个拥有自己的环境的新进程。 所以你的第二个调用没有以任何方式连接到第一个调用。 它只会改变自己的工作目录,然后退出(即它实际上是一个没有操作)。

如果您想编写请求,您需要在一次调用exec 。 Bash允许在一行中指定多个命令,如果它们用分号隔开的话; Windows CMD可能允许相同的,如果不是总是批处理脚本。

正如Piotr所说 ,如果这个例子实际上是你想要达到的目的,那么你可以更有效,更高效和更平台地执行相同的操作,具体如下:

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

试试这个链接

您不使用“cd”来更改运行命令的目录。 您需要您要运行的可执行文件的完整path。

此外,列出目录的内容更容易处理文件/目录类

每个exec调用都会创build一个进程。 您的第二个和第三个调用不会在您在第一个调用中创build的同一个shell进程中运行。 尝试将所有命令放在bat脚本中,并在一次调用中运行它: rt.exec("cmd myfile.bat"); 或类似的

这是因为每个runtime.exec(..)返回一个Process类,它应该在执行后使用,而不是由Runtime类调用其他命令

如果你看看Process doc,你会看到你可以使用

  • getInputStream()
  • getOutputStream()

你应该通过发送连续的命令并检索输出来工作。

从stream程中写出来是错误的方向。 在这种情况下,'出'意味着从这个过程到你。 尝试获取/写入进程的inputstream,并从输出stream中读取以查看结果。

由于我也面临同样的问题,因为这里的一些人评论说这个解决scheme不适合他们,这里是find工作解决scheme的post的链接。

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

另请参阅使用Cygwinterminal的最佳答案中的“更新”