如何通过Java运行多个cmd命令?

问题描述

我有一个简单的 GUI,可以选择一个可执行文件一个批处理文件。单击“运行”应该启动一个命令行实例,然后运行给定选定批处理的可执行文件。然而,打嗝似乎出现在不同的点。这是相关的代码片段:

String[] commands = {"cmd.exe","/c","C:\\Xilinx\\14.7\\ISE_DS\\settings64.bat && cd /d ","\"" + simFile.getParent() + "\""," && ping localhost && ","\"" + jTextField1.getText() + "\""," -tclbatch \"" + jTextField2.getText() + "\""};

ProcessBuilder simBuilder = new ProcessBuilder(commands);
simBuilder.redirectErrorStream(true);
Process simulation = simBuilder.start();

BufferedReader reader = new BufferedReader(new InputStreamReader(simulation.getInputStream()));
String line;
while (true) {
    line = reader.readLine();
    if (line == null)
        break;
    System.out.println(line);
}

我选择通过 ProcessBuilder 而不是“Runtime.getRuntime().exec”来创建进程,因为将命令和参数作为字符串数组更易读和更易于管理。我查看了 Runtime、Process 和 ProcessBuilder 的文档。我还搜索了类似的问题,以下是最接近的:Run cmd commands through Java。但是,如果所有命令都正常运行,我仍然遇到问题。第一点:程序成功执行命令直到“ping”,我放置它以确定问题发生的位置。我通过 BufferedReader 在控制台中得到 cmd 输出就好了。但是,下一个命令应该运行由“jTextField1.getText()”指示的可执行文件,尽管我确保路径在转义的双引号内,但会给出“文件名、目录名或卷标语法不正确”的错误占空间。这是我的语法吗?与双符号的放置位置有关吗?是否每个单独的命令及其参数都需要在数组中是它自己的字符串?我尝试了不同的方法,但似乎总是会导致错误

解决方法

您应该检查您的路径名是否正确,并尝试将 cmd 作为一个参数值,而不是在 cmd.exe /c 后以逗号分隔。这将确保参数作为 CMD shell 处理的单个参数正确传递给 CMD:

import java.nio.file.Files
System.out.println("Files.isDirectory(simFile.getParent())="+Files.isDirectory(simFile.getParent()));
System.out.println("Files.isExecutable(jTextField1.getText())="+Files.isExecutable(Path.of(jTextField1.getText())));

String cmd = "C:\\Xilinx\\14.7\\ISE_DS\\settings64.bat && cd /d "+
            "\"" + simFile.getParent() + "\" && ping localhost && "+
            "\"" + jTextField1.getText() + "\" -tclbatch \"" + jTextField2.getText() + "\"";
String[] commands = {"cmd.exe","/c",cmd};