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

问题描述 投票:2回答:1

我遇到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获取退出代码?请指教,谢谢!

java powershell exit-code
1个回答
0
投票

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

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

powershell -file C:\test\return_sth.ps1

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

© www.soinside.com 2019 - 2024. All rights reserved.