ProcessBuilder中的waitFor无法正常工作

问题描述

我试图打开Outlook eml文件,并等待用户何时关闭eml窗口。 我使用以下代码

ProcessBuilder pb = new ProcessBuilder();
pb.command("cmd.exe","/C","start","/wait","outlook.exe","/eml","C:/test.eml");
p = pb.start();

try {
    if(p != null) {
        p.waitFor();
    }

} catch(Exception e) {
    logger.log(Level.INFO,"Got an exception.",e);
    throw e;
} finally {
    logger.info("closing process...");
}

但是直到我关闭eml窗口才等... 在此之前打印“关闭过程中...”。

我该怎么办?


更新(2020年9月30日):基于首次回答和评论的新代码

    ProcessBuilder pb = new ProcessBuilder("outlook.exe","email5704371022351125516.eml");
    Process p = pb.start();
    p.waitFor();
    System.out.println("Closing process...");

解决方法

尽管您可能需要完全限定Outlook的路径名,但您不必启动CMD即可启动Outlook:

ProcessBuilder pb = new ProcessBuilder("outlook.exe","/eml","C:\\test.eml");
Process p = pb.start();
p.waitFor();
logger.info("Closing process...");

此外,也无需检查p!=null,因为start()会引发异常或返回进程句柄。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...