2

通过 java web 应用程序执行批处理文件时,出现以下描述的错误。

我不知道为什么只有案例 1 按预期工作,在案例 2、3、4 中,只执行部分批处理文件。任何人都可以向我解释为什么?非常感谢。

使用执行命令Runtime.getruntime().exec(command)

case1. cmd /c start C:\mytest.bat
case2. cmd /c start /b C:\mytest.bat
case3. cmd /c C:\mytest.bat
case4. C:\mytest.bat

mytest.bat

echo line1 >>%~dp0test.txt
echo line2 >>%~dp0test.txt
echo line3 >>%~dp0test.txt
echo line4 >>%~dp0test.txt
echo line5 >>%~dp0test.txt
echo line6 >>%~dp0test.txt
echo line7 >>%~dp0test.txt
echo line8 >>%~dp0test.txt
echo line9 >>%~dp0test.txt
echo line10 >>%~dp0test.txt
echo line11 >>%~dp0test.txt
echo line12 >>%~dp0test.txt
echo line13 >>%~dp0test.txt
echo line14 >>%~dp0test.txt
echo line15 >>%~dp0test.txt
echo line16 >>%~dp0test.txt
echo line17 >>%~dp0test.txt
echo line18 >>%~dp0test.txt
echo line19 >>%~dp0test.txt
echo line20 >>%~dp0test.txt
exit

结果test.txt

情况1:

line1 
line2 
line3 
line4 
line5 
line6 
line7 
line8 
line9 
line10 
line11 
line12 
line13 
line14 
line15 
line16 
line17 
line18 
line19 
line20 

案例2、3、4:

line1
line2
line3
line4
line5
4

3 回答 3

1

可能会发生这种情况,因为您的程序在底层 Process(的执行mytext.bat)完成之前终止。在您的第一种情况下,您使用startwhich 在其自己的环境中开始执行,因此即使其父级终止,执行也会继续。您的所有其他命令在当前环境中执行批处理文件并以您的应用程序终止。

要解决此问题,您必须等待执行mytext.bat完成。有几种方法可以做到这一点,但我建议使用 Process Builder:

ProcessBuilder b = new ProcessBuilder("cmd", "/c", "C:\\mytest.bat");
Process p = b.start();
p.waitFor();

要使用您的方法:

Process p = Runtime.getruntime().exec(command)
p.waitFor();
于 2013-09-30T07:33:44.357 回答
0

只需将 /wait 添加到从第二个命令开始的命令中,如下所示:

 cmd /c start C:\mytest.bat
 case2. cmd /c start /wait /b C:\mytest.bat
 case3. cmd /c /wait C:\mytest.bat
 case4. C:\mytest.bat
于 2013-09-30T10:28:38.703 回答
-1

当您执行命令而不打开带有 /b 选项的窗口或没有启动时,您需要保持暂停。在这里,我暂停了一秒钟,程序运行良好。

public class MyTest{
    public static void main(String args[]) throws Exception{
        //Runtime.getRuntime().exec("cmd /c start D:\\mytest.bat");//No pause required
        Runtime.getRuntime().exec("cmd /c start /b D:\\mytest.bat");//pause required
        //Runtime.getRuntime().exec("cmd /c D:\\mytest.bat");//pause required
        //Runtime.getRuntime().exec("D:\\mytest.bat");//pause required
        Thread.sleep(1000);//Pause for one second
    }
}
于 2013-09-30T08:13:29.003 回答