如何通过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。
(我已经修改了我的问题更具体,下面的答案是有帮助的,但不回答我的问题。)
你发布的代码启动三个不同的进程,每个都有自己的命令。 要打开一个命令提示符,然后运行一个命令,请尝试以下操作(从未尝试过):
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的最佳答案中的“更新”