Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java运行.exe并继续_Java_Batch File_Processbuilder - Fatal编程技术网

从java运行.exe并继续

从java运行.exe并继续,java,batch-file,processbuilder,Java,Batch File,Processbuilder,如果.exe程序尚未运行,我希望以编程方式运行该程序。 目前,我使用process builder从java启动.bat。批处理文件在检查.exe是否正在运行后运行。 问题是,在用户关闭.exe程序之前,java不会继续运行。我怎样才能解决这个问题 Java代码: try { ProcessBuilder builder = new ProcessBuilder("open.bat"); final Process process = builder.start(

如果.exe程序尚未运行,我希望以编程方式运行该程序。 目前,我使用process builder从java启动.bat。批处理文件在检查.exe是否正在运行后运行。 问题是,在用户关闭.exe程序之前,java不会继续运行。我怎样才能解决这个问题

Java代码:

try {
        ProcessBuilder builder = new ProcessBuilder("open.bat");
        final Process process = builder.start();
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        while ((br.readLine()) != null) {
        }
        System.out.println("command line terminated");
    } catch (Exception err) {
        err.printStackTrace();
        System.out.println("error  ");
    }
批次代码:(open.bat)


已更新

使用

start "" "C:\Program Files (x86)\Adobe\Adobe Illustrator CS4\Support Files\Contents\Windows\illustrator.exe"
作为
open.bat
批处理文件并使用

try {
    ProcessBuilder builder = new ProcessBuilder("open.bat");
    builder.redirectError();
    builder.inheritIO();
    final Process process = builder.start();
    final InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String text = null;
    while ((text = br.readLine()) != null) {
        System.out.println(text);
    }

    System.out.println("command line terminated");
    System.out.println("Exited with " + process.waitFor());
} catch (Exception err) {
    err.printStackTrace();
    System.out.println("error  ");
}
我可以让批处理文件运行和终止,仍然有Illustrator加载和运行

主要的新增功能是调用
ProcessBuilder#Inheritaio
,这有一些我不知道的魔力,但似乎允许批处理文件终止

这提供了与大多数操作系统命令解释器或标准C库函数system()相当的行为


创建一个新线程?将
同时((br.readLine())!=null){
移动到另一个线程,让它安静地使用结果,这将允许其余的代码,记住,IO可能会阻塞,循环也会阻塞;)您是否得到“命令行终止”输出??释放你的进程这很奇怪;
start
应该立即返回。当你打印从程序中读取的行时,它会说什么吗?@MadProgrammer这在这里是不必要的,对吧?因为
start
应该启动
illustrator.exe
分离,理论上批处理文件不应该在某个时间等待对于它运行到终点的程序,@Audrey Yea,这是一个有趣的过山车旅程,“我不知道为什么会这样,但它会这样,所以不要想太久,否则它可能会停止”…在办公室里,和;)来自API的:pb.inheritIO()的行为与调用pb.redirectInput(Redirect.INHERIT)的行为完全相同.redirectOutput(Redirect.INHERIT).redirectError(Redirect.INHERIT)很吸引人。有机会的话,我想更深入地研究一下。
start
设置标准流的方式一定有些奇怪。让它工作起来很好。@Audrey只是出于好奇,如果你有机会,如果你将批处理文件中的命令更改为
cmd/C start…
,你的原始版本能工作吗?@JasonC我大约90%确定这对我不起作用,但我做了太多奇怪的事情,我可能错了。。。
try {
    ProcessBuilder builder = new ProcessBuilder("open.bat");
    builder.redirectError();
    builder.inheritIO();
    final Process process = builder.start();
    final InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String text = null;
    while ((text = br.readLine()) != null) {
        System.out.println(text);
    }

    System.out.println("command line terminated");
    System.out.println("Exited with " + process.waitFor());
} catch (Exception err) {
    err.printStackTrace();
    System.out.println("error  ");
}