【问题标题】:Get exit value of CMD child process called from java program获取从java程序调用的CMD子进程的退出值
【发布时间】:2015-11-13 22:26:23
【问题描述】:

在我的 java 程序中,我试图通过 CMD 运行另一个程序,其输出出现在前台的命令窗口中,然后分析主 java 程序中子程序 (foo) 的退出代码。不幸的是,我似乎只能访问 CMD 窗口的退出代码,该代码始终为 0。

以下是我正在做的事情的sn-p:

ProcessBuilder pb = new ProcessBuilder();
pb.directory(new File(dir));
pb.command("cmd","/c","start","/wait","foo.exe",arg);
process = pb.start();
exitVal = process.waitFor();

但无论 foo 如何退出,exitVal 始终为 0。我怎样才能得到 foo 的退出代码?
我对 java 也很陌生,所以如果有更优雅的方式来做这件事,我愿意接受建议。

【问题讨论】:

  • 很可能foo 在退出并出现错误时不会返回正确的值。为什么不举一个总是返回 0 的 foo 的例子?
  • 我知道 foo 返回正确的值,因为我可以从命令窗口调用它,然后使用 'echo %errorlevel%' 查看它的返回值。什么样的例子可以帮助你?
  • 一个总是返回 0。另外我不知道你是怎么得到%errorlevel%的。
  • 例如,如果arg 无效 foo 将立即退出,退出代码应该是 1,但是 exitVal 仍然读取 0,因为 cmd 进程成功关闭。抱歉,我的意思是当我从命令提示符运行 foo 时,Windows 局部变量 %errorlevel% 包含最新的退出代码。
  • 那你读的不是foo的返回值,而是cmd的返回值。直接启动foo,而不是通过cmd

标签: java cmd


【解决方案1】:

我通过修改我之前尝试过的一个方法找到了一个解决方案,以解决 Windows 批处理的挑剔问题。解决方案是向cmd 发送另一个命令,告诉它以最新的错误代码退出。之前我曾尝试通过将& exit %errorlevel% 附加到命令中,但cmd 变量仅在每个命令行的末尾更新,而不是在每个命令的末尾。
为了强制更新,我改用%^errorlevel%

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 2022-11-10
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多