2012-08-14 46 views
2

我做了2个.java文件和1个.bat文件。让我们将第一个.java文件称为“First.java”,将第二个称为“Second.java”。批处理文件是“compile.bat”。比方说First.java位于“... /桌面/温度/ First.java”,并Second.java是“... /桌面/测试/ Second.java”与一个批处理文件一起(” .. ./Desktop/Test/compile.bat“)。现在,包括的compile.bat这段代码:是否可以从java中更改CMD目录?如果是这样,怎么样? (如 “CD”,在CMD)

cmd /c "cd C:\blahblah\temp && javac First.java" 

我无论在CMD并通过双击测试了它,它的工作原理。我想从Second.java编译First.java与此代码:

Process p1 = Runtime.getRuntime().exec("C:\\blahblah\\compile.bat"); 

(我必须导航到DIR因为CMD的默认目录是不一样的compile.bat的目录)。这不起作用。它似乎只是忽略了代码。正如我所说的,我尝试了很多不同的东西,甚至尝试使用其他应该更改目录的其他库。请帮帮我!

+0

尝试:'调用Runtime.getRuntime()EXEC( “CMD/C C:\ blahblah \的compile.bat”)' – ig0774 2012-08-14 12:00:59

+0

@ ig0774不要忘了逃脱\(在MrLore的回答中指出)即''C:\\ blahblah \\ compile.bat“' – 2012-08-14 12:46:49

+1

@BrianJ:好点。那是在我喝咖啡之前。 – ig0774 2012-08-14 13:58:53

回答

2

最简单的方法:你应该使用start。设置工作目录也是可以的,看看下面这个例子:

Runtime r=Runtime.getRuntime(); 
    r.exec("cmd.exe /c start compile.bat",   //path to executable 
      null,         // env vars, null means pass parent env 
      new File("C:\\blahblah"));    // working directory 

附加信息: 如果你不想启动的过程中它是单独的控制台(这是start一样),你可以做r.exec("cmd.exe /c compile.bat");,而是因为它执行它的上下文中的父控制台,你必须等待p.waitFor()或读它的输入流 - 否则它可能会默默地失败。从你 这将运行和显示输出命令:

Process p=r.exec("cmd.exe /c compile.bat",   //path to executable 
      null,         // env vars, null means pass parent env 
      new File("C:\\blahblah")); 

    InputStream is=p.getInputStream(); 
    BufferedReader br= new BufferedReader(new InputStreamReader(is)); 

    String line=new String(); 
    while ((line=br.readLine())!=null) System.out.println (line); 

同样如1.5的ProcessBuilder被优先停留的方式开始处理(从Java DOC):

java.lang.Process中

创造过程可能不适合某些本地平台,比如本地窗口 进程,守护进程特别 工艺做工精良的方法,Win16的/ DOS进程上Microsoft Windows, 或shell脚本。

默认情况下,创建的子进程没有自己的终端或 控制台。它的所有标准I/O(即标准输入,标准输出,标准错误)操作 将被重定向到父进程,可以通过使用方法getOutputStream(), getInputStream()和getErrorStream()获得的流访问 。 。父进程使用这些 流将输入提供给子进程并从子进程获取输出。由于 某些本机平台仅为标准的 输入和输出流提供有限的缓冲区大小,未能及时写入输入流 或读取子流程的输出流可能导致子流程 阻塞甚至死锁。

在需要时,子进程的I/O还可以使用的 所述的ProcessBuilder类方法重定向。

当没有对 过程对象的更多引用,而是子进程异步继续执行 时,子流程不会被终止。

并不要求由Process对象 表示的进程对拥有Process对象的Java 进程异步执行或同时执行。

作为1.5,ProcessBuilder.start()是创建一个 工艺的首选方式。

由于:JDK1.0

+0

作为MrLore在他的回答中指出,你会想逃避所有\ Java中的字符串即'新文件(“C:\\ blahblah”)' – 2012-08-14 12:44:44

+1

我只是这样做,因为你写您的评论:-)我大摇大摆复制从问题...也,'c:/ blahbla'也可以避免逃脱,并使其更具可读性 – wmz 2012-08-14 12:46:50

+0

哈哈,对不起。另外,有关使用/而不是\ – 2012-08-14 12:48:04

1

如果这是来自Java的直接引用,那么您会错过末尾的分号,字符串中必需的转义字符以及cmd命令,以向Windows表明它需要cmd.exe才能启动它:

Process p1 = Runtime.getRuntime().exec("cmd C:\\blahblah\\compile.bat"); 

您还可以添加/ C CMD后尽快关闭的进程,因为它完成,和/或启动,以表明它应该在另一个窗口中启动。

相关问题