2016-06-12 92 views
3

我运行一个批处理(ScanProject.bat)用java通过下面的代码命令提示符不关闭正在运行已在最后一行“退出”

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 

批处理文件运行成功,但问题是命令提示符窗口不会自动,因此过程不会自动终止,我计划等待无限长的时间来完成这个process.Please关闭建议我任何高科技nique让cmd 退出运行后ant -f .. \ antbuild.xml分析命令。

谢谢。

回答

2

cd /D "Full path of directory"pushd "Full path of directory"popd前出口不如当前目录切换到任何目录上的任何驱动器(CDPUSHD/POPD),或者甚至到网络共享(只是PUSHD/popd)。有关详细信息,请在命令提示符窗口cd /?pushd /?中运行。

cmd /C启动一个新的Windows命令进程,在执行最后一个命令后自动关闭进程。有关Windows命令解释器选项的详细信息,请在命令提示符窗口cmd /?中运行。

start是在单独的进程中启动新的Windows命令进程或GUI /混合应用程序的命令。

所以你在这里做的是启动一个新的Windows命令过程,启动一个新的Windows命令过程。

在命令提示符窗口中运行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. 在此目录中执行ant并使用指定参数
  4. 在控制台应用程序自动终止Windows命令过程后ant.exe完成如果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)执行其参数与这可能是这个任务更好的第三个参数定义的目录-f..\antbuild.xmlanalyseant.exe的命令。

+0

感谢您的回答,我在回调中使用了退出,并且工作,非常感谢。 –

0

假设您没有任何其他cmd进程在运行,请将taskkill的交换出口退出。不是很优雅,但它会完成工作。

%2: 
cd %1 
ant -f ..\antbuild.xml analyse 
taskkill /im cmd.exe 
+0

感谢您的回答,但它不适合我。 –