运行批处理文件后,命令提示符不会关闭,该文件有'退出'在最后一行

时间:2016-06-12 05:41:11

标签: java batch-file ant cmd

我正在使用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 命令后。

感谢。

2 个答案:

答案 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"); 

应该足够

  1. 启动新的Windows命令进程
  2. 将此命令进程中的当前目录设置为jo.getString("Name")指定的驱动器和目录,当然必须返回带驱动器号的目录路径并使用反斜杠作为目录分隔符,并且成功
  3. 使用指定的参数
  4. 在此目录中执行ant
  5. 在控制台应用程序ant.exe完成后自动终止Windows命令进程,如果ant.exe是控制台应用程序。
  6. 我不确定是否需要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