2017-08-06 196 views
1

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

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

这将打开CMD,但进入我的git的项目的路径,但犯规运行批处理文件。

我尝试使用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 
+0

您是否尝试过使用批处理文件的绝对路径(不使用相对路径./BatchFiles/...)。 Windows上的目录分隔符是反斜杠,但第一个示例显示错误的分隔符。 – mao

+0

你可以尝试批处理文件的绝对路径吗?重命名批处理文件,使其间没有空间。要检查,批处理文件中的内容是否正确,请尝试手动运行它。 –

+0

批处理文件手动运行完美。我也使用了绝对路径。 调用Runtime.getRuntime()EXEC( \t \t \t \t “CMD/C开始\” d:\\工作\\ GIT REPOSITORY \\ project.selenium.maven.jenkinsCI \\批处理文件中\\ START_HUB.bat \” “); – Sidhant

回答

1

之间所以,你要执行的命令行 除了报价,因为你有一个空白的路径已经开始执行%SystemRoot%\System32\cmd.exe。这个命令过程应该在运行命令后自动关闭,如明确请求使用选项/C,这意味着关闭,因为它可以在命令提示符窗口cmd /?中运行读取。

该命令在该命令处理执行的是:

start "./BatchFiles/START HUB.bat" 

内部命令的cmd.exestart是用于开始在一个新的处理的可执行文件或脚本。可以在命令提示符窗口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,该命令启动另一个命令进程,标题为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命令:在命令提示窗口cd /?cd /D D:\work帮助

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

运行并看到Single line with multiple commands using Windows batch file对于这里使用操作者&&的说明来指定两个命令,由此java.exe在一行上以执行仅在cd可以成功将工作目录更改为D:\work时执行。

+0

下面的代码确实有效 Runtime.getRuntime().exe(“cmd.exe/C start \”start hub \“\”。\\ BatchFiles \\ START_HUB.bat \“”); – Sidhant

0
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功能?在命令行中的新命令过程的开始

​​

随着cmdSTARTHUB

+0

是的,我已经尝试过绝对路径和bat文件的名称是START HUB..that包含一个空格。你能告诉我批处理文件的内容是否正确吗? – Sidhant

+0

批处理文件中的语句似乎是正确的 - 没有错误!如果可能的话,您可以将批处理文件重命名为不包含空格的文件? (我仍然认为这是问题) – r3dst0rm

+0

尝试将批处理文件重命名为START_NODE.bat。仍然是同样的问题。 cmd只是打开路径 D:\ work \ GIT REPOSITORY \ project.selenium.maven.jenkinsCI> – Sidhant

0

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

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

以上是为我工作的解决方案。