【问题标题】:How can I execute CMD commands with java?如何使用 java 执行 CMD 命令?
【发布时间】:2020-01-10 11:13:21
【问题描述】:

我希望我的 java 程序执行以下操作:

访问cmd并执行命令:“d:”、“cd D:\Java Projects\imageProject”、“screenshot-cmd”

我尝试用谷歌搜索并找到了一些代码示例,但没有一个有效,因为我可能不知道自己在做什么。

这就是我现在拥有的:

static void imageFromCMD(){
     ProcessBuilder builder = new ProcessBuilder(
                "cmd.exe", "d:", "cd D:\\Java Projects\\imageProject",
                "screenshot-cmd");
     Process p = builder.start(); 
}

该代码没有失败,但我没有得到我期望的输出(目录中的图像)

我想我错过了“发送”部分,但我该怎么做呢?

【问题讨论】:

标签: java


【解决方案1】:

你可以试试这个吗?

ProcessBuilder processBuilder = new ProcessBuilder();
Path workingDir = Paths.get("D:\\Java Projects\\imageProject");
processBuilder.directory(workingDir.toFile()); // Edited here
processBuilder.command(".\\screenshot-cmd");
try {
    processBuilder.start();
} catch (Exception ex) {
    ex.printStackTrace();
}

另一种选择是在创建ProcessBuilder 时提供可执行文件的完整路径

ProcessBuilder processBuilder = new ProcessBuilder("D:\\Java Projects\\imageProject\\screenshot-cmd");
try {
    processBuilder.start();
} catch (Exception ex) {
    ex.printStackTrace();
}

需要注意的是,如果你在创建ProcessBuilder时没有设置工作目录,那么你的主进程的目录默认就是工作目录(基本上是从你的主类被调用的地方),也许尝试在那里查看屏幕截图是否正在保存到该位置

【讨论】:

  • 现在它说“不能在目录中运行 screenshot-cmd”,但是当我手动执行它并且我确保它的名称正确时它工作正常
  • 你遇到了什么异常? SecurityException ?
  • java.io.IOException: Cannot run program "screenshot-cmd" (in directory "D:\Java Projects\imageProject"): CreateProcess error=2, 系统找不到指定的文件跨度>
  • 这个超级有趣,你可以试试这个processBuilder.command(".\\screenshot-cmd");,基本上就是说应该在当前工作目录下找到那个命令
  • 请尝试我最近的编辑尝试,如果这也不能解决问题,我真的不知道为什么。另外,可执行文件是否有.exe 扩展名?如果是这样,您还必须在 ProcessBuilder 配置中包含扩展名
【解决方案2】:

这是我检查 Java 版本的程序。希望对您有所帮助。

import java.io.*; 
public class RunCMDByJava {
    public static void main(String[] args) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "java -version");
        pb.redirectErrorStream(true);
        Process p = pb.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while (true) {
            line = br.readLine();
            if (line == null) {
                break;
            }
            System.out.println(line);
        }
    }
}

【讨论】:

    【解决方案3】:

    首先找出要运行的确切 cmd.exe 行,然后将其填充到 ProcessBuilder 中,就像这样

    new ProcessBuilder("cmd.exe", "/c", "cd /tmp & dir")
    

    请注意,所有命令都应作为一个参数传递给 cmd.exe。

    【讨论】:

    • 如果电脑是 Mac 会怎样?意思是没有cmd.exe?
    • 既然问题是在CMD上,我的理解是这一定是Windows。
    • 哦,是的,我的错。
    最近更新 更多