【问题标题】:Is it possible change the CMD directory from java? If so, how? (Like "CD" in CMD)是否可以从 java 更改 CMD 目录?如果是这样,怎么做? (如 CMD 中的“CD”)
【发布时间】:2012-08-10 17:01:03
【问题描述】:

我制作了 2 个 .java 文件和 1 个 .bat 文件。让我们将第一个 .java 文件称为“First.java”,将第二个称为“Second.java”。批处理文件是“compile.bat”。假设 First.java 位于“.../Desktop/temp/First.java”中,而 Second.java 与批处理文件(“.. ./Desktop/Test/compile.bat")。现在,compile.bat 包含以下代码:

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

我在 CMD 和双击中都对其进行了测试,它可以正常工作。我想用这个代码从 Second.java 编译 First.java:

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

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

【问题讨论】:

  • 试试:Runtime.getRuntime().exec("cmd /c C:\blahblah\compile.bat")
  • @ig0774 不要忘记在 Java 中转义 \ (正如 MrLore 在他的回答中指出的那样),即"C:\\blahblah\\compile.bat"
  • @BrianJ:好点。那是在我喝咖啡之前。

标签: java directory cmd


【解决方案1】:

最简单的方法:你应该使用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 文档):

java.lang.Process

创建流程的方法可能不适用于特殊情况 某些本机平台上的进程,例如本机窗口 进程、守护进程、Microsoft Windows 上的 Win16/DOS 进程、 或外壳脚本。

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

如果需要,也可以使用以下方法重定向子进程 I/O ProcessBuilder 类。

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

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

从 1.5 开始,ProcessBuilder.start() 是创建 处理。

自:JDK1.0

【讨论】:

  • 正如 MrLore 在他的回答中指出的那样,您将希望转义 Java 字符串中的所有 \,即 new File("C:\\blahblah")
  • 我只是在你写评论时这样做:-)我公然从问题中复制...另外,c:/blahbla 也可以避免转义并使其更具可读性
  • 是的,它不是直接从我的代码中复制的,所有的 \ 都被转义了,我有;在末尾。我急着输入问题
【解决方案2】:

如果这是来自 Java 的直接引用,那么您缺少末尾的分号、字符串中必要的转义字符以及用于向 Windows 指示它需要 cmd.exe 来启动它的 cmd 命令:

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

您还可以在 cmd 之后添加 /c 以在进程完成后立即关闭进程,和/或 start 指示它应该在另一个窗口中启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-12-13
    相关资源
    最近更新 更多