我正在使用java运行批处理( ScanProject.bat )文件,代码如下
Process p= Runtime.getRuntime().exec("cmd /c start /wait ScanProject.bat "+ BaseProjDir+"\\"+jo.getString("Name")+" "+st.nextToken());
System.out.println("Exit value : "+p.waitFor());
以下是批处理文件代码: -
%2:
cd %1
ant -f ..\antbuild.xml analyse
exit
批处理文件运行成功,但问题是命令提示窗口不会自动关闭,因此进程不会自动终止,我的程序会等待无限时间来完成此过程。请告诉我任何技术,以便cmd 退出运行 ant -f .. \ antbuild.xml analyze 命令后。
感谢。
答案 0 :(得分:2)
cd /D "Full path of directory"
或pushd "Full path of directory"
与popd
最好将当前目录切换到任何驱动器上的任何目录( cd 和 pushd < / strong> / popd )甚至是网络共享(只需推送 / popd )。在命令提示符窗口cd /?
和pushd /?
中运行以获取详细信息。
cmd /C
启动新的Windows命令进程,并在执行完最后一个命令后自动关闭进程。在命令提示符窗口cmd /?
中运行,以获取有关Windows命令解释程序选项的详细信息。
start 是一个在单独进程中启动新Windows命令进程或GUI /混合应用程序的命令。
所以你在这里做的是启动一个新的Windows命令进程,它启动一个新的Windows命令进程。
在命令提示符窗口start /?
中运行会输出此命令的帮助。 start 经常将第一个双引号字符串解释为新命令进程的标题字符串。这会导致命令行经常出现问题,并且至少有一个双引号字符串。因此, start 的使用通常需要在双引号中明确定义标题字符串作为 start 的第一个参数,它甚至可以是空字符串,即只是""
作为开始后的第一个参数。
由于在命令提示符窗口中运行exit /?
后可以读取,因此不带/B
的此命令将始终立即退出当前的Windows命令进程。因此,当ant.exe
完成时,处理批处理文件的命令进程肯定会被终止。
我没有Java开发经验,但在我看来,使用以下执行命令就足够了,根本不需要批处理文件。
Java代码行
Process p= Runtime.getRuntime().exec("cmd.exe /C cd /D \"" + jo.getString("Name") + "\" && ant.exe -f ..\\antbuild.xml analyse");
应该足够
jo.getString("Name")
指定的驱动器和目录,当然必须返回带驱动器号的目录路径并使用反斜杠作为目录分隔符,并且成功ant
ant.exe
完成后自动终止Windows命令进程,如果ant.exe
是控制台应用程序。我不确定是否需要cmd.exe /C
。
我建议首先在命令提示符窗口中手动测试此命令。然后在Java应用程序中使用它,如果真的有效并产生预期的结果。最后,我将进一步测试Java代码中是否需要cmd.exe /C
。
有关在上一个命令成功后运行命令的运算符&&
的详细信息,请参阅Single line with multiple commands using Windows batch file。另请参阅Why do not all started applications save the wanted information in the text files as expected?以获取有关控制台 / GUI / 混合应用程序的说明。
注意:还有Java Runtime
方法exec(String[] cmdarray, String[] envp, File dir)来执行ant.exe
之类的命令及其参数-f
和..\antbuild.xml
使用第三个参数定义的目录中的{和} analyse
可能更适合此任务。
答案 1 :(得分:0)
假设您没有运行任何其他cmd进程,请换出taskkill的exit。不是很优雅,但它会完成工作。
%2:
cd %1
ant -f ..\antbuild.xml analyse
taskkill /im cmd.exe