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

无法在java程序中运行.bat文件,java,selenium,batch-file,cmd,selenium-grid2,Java,Selenium,Batch File,Cmd,Selenium Grid2,问题陈述:我只想启动集线器和节点,使用Selenium网格执行一些测试。 我有两个批处理文件START HUB.bat和START NODE.bat,当我手动运行它们时,它们运行得非常好。 但我希望它们使用Java程序@BeforeMethod运行。 我在寻找答案 Runtime.getRuntime().exec("cmd /C start \"./BatchFiles/START HUB.bat\""); 这会打开CMD,但会转到my.git项目的路径,但不会运行bat文件 我尝试

问题陈述:我只想启动集线器和节点,使用Selenium网格执行一些测试。 我有两个批处理文件START HUB.bat和START NODE.bat,当我手动运行它们时,它们运行得非常好。 但我希望它们使用Java程序@BeforeMethod运行。 我在寻找答案

    Runtime.getRuntime().exec("cmd /C start \"./BatchFiles/START HUB.bat\"");
这会打开CMD,但会转到my.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
是否尝试将绝对路径传递给
exec
函数?
由于在
START
HUB

之间有一个空格,因此请引用路径,以便执行命令行:

cmd /C start "./BatchFiles/START HUB.bat"
使用命令行开头的
cmd
,新的命令进程已经开始,执行
%SystemRoot%\System32\cmd.exe
。此命令进程应在运行命令后自动关闭,如使用选项
/C
明确要求,这意味着关闭,因为在命令提示窗口
cmd/?
中运行时可以读取该进程

在此命令过程中要执行的命令是:

start "./BatchFiles/START HUB.bat"
cmd.exe
的内部命令
start
用于在新进程中启动可执行文件或脚本。在命令提示符窗口中运行时,可以阅读其帮助
start/?

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

这就是为什么不执行批处理文件的原因,因为
“/BatchFiles/START HUB.bat”
被解释为窗口标题字符串

在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
,该命令进程使用title
start hub
执行批处理文件启动另一个命令进程。在运行
start
后,使用
cmd.exe启动的第一个命令进程立即终止,而批处理文件在第二个启动的命令进程中执行。这意味着您的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:\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");

在命令提示窗口中运行
cd/?
以获取有关
cd/D:\work
的帮助,并参阅以获取有关运算符
&
的说明,此处使用运算符
&
指定要在一行上执行的两个命令,其中
java.exe
仅在
cd
可以成功将工作目录更改为
D:\work

在这里@Mofi的解释确实有助于理解cmd是如何对待每一个“/”的


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

您是否尝试过使用批处理文件的绝对路径(而不是相对路径。/BatchFiles/…)。Windows上的目录分隔符是反斜杠,但您的第一个示例显示了错误的分隔符。您可以尝试使用批处理文件的绝对路径吗?重命名批处理文件,使其之间没有空间。要检查批处理文件中的内容是否正确,请尝试手动运行。批处理文件手动运行完全正常。我也使用了绝对路径。Runtime.getRuntime().exec(“cmd/C start\”D:\\work\\GIT REPOSITORY\\project.selenium.maven.jenkinsCI\\BatchFiles\\start\u HUB.bat\”);是的,我试过使用绝对路径,bat文件的名称是START HUB..,其中包含一个空格。你能告诉我批处理文件的内容是否正确吗?批处理文件中的语句似乎是正确的-没有任何错误!如果可能,您可以将批处理文件重命名为不包含空格的文件吗?(我仍然认为这是问题所在)尝试重命名批处理文件以启动_NODE.bat。还是一样的问题。cmd只是以路径D:\work\GIT REPOSITORY\project.selenium.maven.jenkinsCI>打开,您是否使用了
cmd/C\”D:\\work\\GIT REPOSITORY\\project.selenium.maven.jenkinsCI\\BatchFilesmyBatchFile.bat\\START HUB.bat\“
来实现这一点?由@Mofi提供的解决方案非常有效。力需要绝对路径。Runtime.getRuntime().exec(“cmd.exe/C start\”start hub\“\”\\BatchFiles\\start\u hub.bat\”);下面的代码在Runtime.getRuntime().exec(“cmd.exe/C start\“start hub\\”\\\BatchFiles\\start\u hub.bat\”)中真正起作用;
Runtime.getRuntime().exec("cmd.exe /C cd /D D:\\work && java.exe -jar selenium-server-standalone-3.4.0.jar -role hub");
    Runtime.getRuntime().exec("cmd.exe /C start \"start hub\" \".\\BatchFiles\\START HUB.bat\"");