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,无法获得正确的返回码的主要内容,如果未能解决你的问题,请参考以下文章
Groovy-Jenkins管道-Groovy CPS不会通过.eachLine方法
使用 Eclipse 从 Android 中的 C 代码调用 Java 函数而不调用 Java
Unity3DUnity 中使用 C# 调用 Java ② ( C# 调用 Java 的相关方法介绍 | 调用 Java 方法 | 获取 Java 字段 | 设置 Java 字段 )