无法 运行 java 程序中的 .bat 文件

Unable to run a .bat file in java program

问题陈述:我只想启动 HUB 和 Node 以使用 Selenium Grid 执行一些测试。 我有两个批处理文件 START HUB.bat 和 START NODE.bat 当我手动 运行 它们时 运行 完美。 但我希望他们 运行 使用 Java 程序 @BeforeMethod。 我在寻找答案

    Runtime.getRuntime().exec("cmd /C start \"./BatchFiles/START HUB.bat\"");

这会打开 CMD,但会转到我的 .git 项目的路径,但不会 运行 bat 文件。

我尝试使用 Process Builder,但无法打开 cmd。

    ProcessBuilder pb = new ProcessBuilder("cmd", "/C"," start", "START HUB.bat");
    File dir = new File("D:\work\GIT REPOSITORY\project.selenium.maven.jenkinsCI\BatchFiles");
    pb.directory(dir);
    Process p = pb.start();

有人可以帮我解决这个问题吗?以下是批处理文件中的命令。

    D:
    cd work
    java -jar selenium-server-standalone-3.4.0.jar -role hub
class RunFile
{
    public static void main(String[] arg){

        Runtime runtime = null;
        try{
            runtime.getRuntime.exec("cmd /C start \"D:\work\GIT REPOSITORY\project.selenium.maven.jenkinsCI\BatchFilesmyBatchFile.bat\START HUB.bat\"");   
        }
        catch(RuntimeException e){ 
            e.printStackTrace();
        }
    }
}

您是否尝试将绝对路径传递给 exec 函数? 以及引用路径,因为你在 STARTHUB

之间有一个空格

所以你要执行命令行:

cmd /C start "./BatchFiles/START HUB.bat"

在命令行开头的 cmd 中,一个新的命令进程已经开始执行 %SystemRoot%\System32\cmd.exe。此命令进程应在 运行 选项 /C 明确请求的命令之后自动关闭,这意味着 close 因为它可以在 运行 中读取命令提示符 window cmd /?.

本次命令过程中要执行的命令为:

start "./BatchFiles/START HUB.bat"

cmd.exe 的内部命令start 用于在新进程中启动可执行文件或脚本。可以在命令提示符 运行 window start /?.

中阅读其帮助

第一个双引号字符串被 start 解释为新命令进程的标题 window 当批处理文件或控制台应用程序应在新命令进程中执行时打开。

这就是批处理文件没有执行的原因,因为"./BatchFiles/START HUB.bat"被解释为window标题字符串。

而在 Windows 上,目录分隔符是 \ 而不是 Unix 上的 // 用作选项的开头,如您在 /C 中所见。但是 Windows 也处理带有 / 的文件路径通常是正确的,因为在访问目录或文件。

所以解决方案是使用

Runtime.getRuntime().exec("cmd.exe /C start \"start hub\" \".\BatchFiles\START HUB.bat\"");

或使用

Runtime.getRuntime().exec("cmd.exe /C \"BatchFiles\START HUB.bat\"");

以目录或文件名开头的路径相对于 Windows 上 运行 进程的当前目录,就像在目录或文件名字符串的开头使用 .\ 一样。

第一个代码启动一个命令进程,该进程执行命令 start,该命令进程又启动一个标题为 start hub 的命令进程来执行批处理文件。以 cmd.exe 开始的第一个命令进程在 运行 start 之后立即终止,而批处理文件在第二个启动的命令进程中执行。这意味着您的 Java 应用程序在并行执行批处理文件时继续。

第二个代码导致在以 cmd.exe 开始的单个命令进程中执行批处理文件,并停止执行 Java 应用程序,直到整个批处理文件执行完成。

可以通过以下方式删除批处理文件的使用:

Runtime.getRuntime().exec("cmd.exe /C start \"start hub\" /D D:\work java.exe -jar selenium-server-standalone-3.4.0.jar -role hub");

使用 /D D:\work 工作 目录 是为开始执行 java.exe 及其参数的命令进程定义的。

或者不使用 start 命令:

Runtime.getRuntime().exec("cmd.exe /C cd /D D:\work && java.exe -jar selenium-server-standalone-3.4.0.jar -role hub");

运行 在命令提示符 window cd /? 中获取有关 cd /D D:\work 的帮助,请参阅 Single line with multiple commands using Windows batch file 以获取对使用的运算符 && 的解释此处指定在一行上执行的两个命令,其中仅当 cd 可以成功将工作目录更改为 D:\work.

时才执行 java.exe

@Mofi 的解释确实有助于理解 cmd 如何处理每个“/”。

    Runtime.getRuntime().exec("cmd.exe /C start \"start hub\" \".\BatchFiles\START HUB.bat\"");

以上是对我有用的解决方案。