Java使用proc.waitFor()调用Powershell,无法获得正确的返回码

时间:2018-04-04 08:41:19

标签: java powershell exit-code

我遇到Java调用PowerShell脚本的问题。 这是我正在使用的测试Java程序的示例:

import java.util.*;
import java.io.*;
import java.sql.*;
import java.text.*;

public class testJava
{
    public static void main (String[] args) {
        StringBuffer sb = new StringBuffer();
        String cmd = "";
        Process proc;
        int exitVal;

        try {
            sb = new StringBuffer();
            sb.append("powershell C:\\test\\return_sth.ps1");
            cmd = sb.toString();
            proc = Runtime.getRuntime().exec(cmd);
            proc.getOutputStream().close(); 
            exitVal = proc.waitFor();

            System.out.println("exitVal = " + exitVal);
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

powershell脚本“return_sth.ps1”是:

exit 123

我发现在Java的变量“exitVal”中我无法获得“123”。 相反,我得到exitVal =“1”。 实际上,来自powershell脚本的所有退出代码除了0(包括负代码,如-1)在exitVal中变为“1”。

我想知道如何从powershell脚本中正确捕获Java中的退出代码。经过测试,我找到了一种可以实现目标的替代方法,但我觉得它看起来有点笨拙而且不聪明:

替换Java的sb.append行
sb.append("powershell.exe -Command \"C:\\test\\return_sth.ps1;exit $lastexitcode\"");

我的新方式是一种方式吗?或者有一个更好,更整洁的调用方法来从PowerShell获取退出代码? 请指教,谢谢!

1 个答案:

答案 0 :(得分:0)

如果使用java -> powershell -> script参数,由于来自-command分叉执行的调用链,退出代码将被吸收,但对于-File参数,exit-code / errorlevel是直接传递给父进程。

关于,我建议您使用-file在您的情况下正确地使用exitcode:

powershell -file C:\test\return_sth.ps1

另一方面,如果你想使用-command参数,你的例子也很好。