批处理文件在Java中停止

时间:2014-07-09 15:39:06

标签: java batch-file

我有一个Java程序(在jar中),它将通过传递参数来调用批处理文件。将使用通过参数的不同值调用相同的批处理文件10次。

这意味着批次将与10个实例并行运行。

这里的问题是,所有过程在某些时候都没有任何理由停止。

请告知如何修复它。

    public static void run(String batpath)
    {
        try
        { 
            System.out.println("Call a batch file");    
            Process p= Runtime.getRuntime().exec("cmd /c CD D:\\ && cd "+v_Base_Path+" && "+batpath+" ");
            p.waitFor();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());         
        }   
    }
}

1 个答案:

答案 0 :(得分:0)

当然,要检查的第一件事是你的命令cmd /C CD ...是否在Java之外正常工作。

然后,启动子进程的推荐方法是使用ProcessBuilder

以下内容适用于Java 7(有关Java 6解决方案,请参阅this answer)。

public class Processes
{
    public static void main(String... args)
    {
        for (int i = 0; i < 10; i++)
        {
            try
            {
                System.out.println("Call a batch file " + i);
                new ProcessBuilder("cmd", "/C", "echo", "hello").inheritIO().start();
                //new ProcessBuilder("bad", "/C", "echo", "hello").inheritIO().start();
            }
            catch (Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    }
}

这使您可以打印出标准输出和错误流,这样您就可以看到批处理文件的任何输出。如果没有这个,你就不会看到任何有关子流程错误的线索。

如果你使用已注释掉的&#34;坏&#34;在上面而不是&#34; good&#34;然后你应该看到错误,而不是&#34;你好&#34; s。

(如果您的批处理文件没有产生任何输出或错误文本,或者永远都悬空,那么您在Java级别无法调试和修复它们 - 您必须查看他们直接找出他们不工作的原因。)

您的批处理文件实际上可能正在挂起,因为您没有读取输出流,如Process文档中所述:

  

因为某些本机平台仅提供有限的缓冲区大小   标准输入和输出流,无法及时写入输入   流或读取子进程的输出流可能会导致   要阻止的子进程,甚至是死锁。

请参阅优秀(尽管现在已经过时了,Java 7和8已经过时)When Runtime.exec() won't文章进行详细讨论。