无法 运行 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
函数?
以及引用路径,因为你在 START
和 HUB
之间有一个空格
所以你要执行命令行:
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\"");
以上是对我有用的解决方案。
问题陈述:我只想启动 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
函数?
以及引用路径,因为你在 START
和 HUB
所以你要执行命令行:
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\"");
以上是对我有用的解决方案。