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

Posted

技术标签:

【中文标题】Java 使用 proc.waitFor() 调用 Powershell,无法获得正确的返回码【英文标题】:Java calls Powershell using proc.waitFor(), cannot get correct return code 【发布时间】:2018-04-04 08:41:18 【问题描述】:

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】:

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

关于,我建议在您的情况下使用-file 正确地通过退出代码:

powershell -file C:\test\return_sth.ps1

另一方面,如果您希望使用 -command 参数,您的示例也完全可以。

【讨论】:

以上是关于Java 使用 proc.waitFor() 调用 Powershell,无法获得正确的返回码的主要内容,如果未能解决你的问题,请参考以下文章

如何用java启动windows命令行程序

Groovy-Jenkins管道-Groovy CPS不会通过.eachLine方法

Groovy脚本将值传递给sh。脚本

使用 Eclipse 从 Android 中的 C 代码调用 Java 函数而不调用 Java

Unity3DUnity 中使用 C# 调用 Java ② ( C# 调用 Java 的相关方法介绍 | 调用 Java 方法 | 获取 Java 字段 | 设置 Java 字段 )

python怎样调用Java中类