Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从批处理文件中的java应用程序获取退出代码_Java_Batch File_Exit - Fatal编程技术网

从批处理文件中的java应用程序获取退出代码

从批处理文件中的java应用程序获取退出代码,java,batch-file,exit,Java,Batch File,Exit,我目前正在努力为我们的一个java应用程序创建测试用例。 在我的代码中,我的java应用程序调用一个批处理文件,该批处理文件反过来启动一个单独的java进程,该进程返回一个错误代码,我需要从调用的java应用程序中使用该错误代码。 我正在执行以下操作以调用批处理文件: Process process = runTime.exec(new String[]{"cmd.exe","/c",scriptPath}); exitValue = process.waitFor(); 批处理文件如下所示:

我目前正在努力为我们的一个java应用程序创建测试用例。 在我的代码中,我的java应用程序调用一个批处理文件,该批处理文件反过来启动一个单独的java进程,该进程返回一个错误代码,我需要从调用的java应用程序中使用该错误代码。 我正在执行以下操作以调用批处理文件:

Process process = runTime.exec(new String[]{"cmd.exe","/c",scriptPath});
exitValue = process.waitFor();
批处理文件如下所示:

@echo off
cd %~dp0
java -cp  frames.FrameDriver
SET exitcode=%errorlevel%
exit /B %exitcode%
现在有了上面的代码和批处理文件,我的JUnit框架就挂在这个特定的测试用例上,好像它在等待它结束一样。现在,当JUnit挂起测试用例时,转到任务管理器并结束java.exe进程将允许JUnit框架继续处理其他用例

双击.bat文件来运行该文件会正常运行Java应用程序

在批处理文件中的
java
命令之前添加
START
批处理命令似乎可以解决挂起的问题,但我似乎无法从java应用程序中获得正确的退出代码,因为它总是0。(Java应用程序退出时使用System.exit(INTEGER_值)返回错误代码)。我假设%errorlevel%值被“start”命令自己的退出值覆盖

谁能告诉我怎么解决这个问题吗

谢谢


注:如果有什么不同,我使用的是JDK 5和Netbeans 5.5.1。

不要在退出时使用/B。下面是我编写脚本的方法:

@ECHO off
ECHO Running %~nx0 in %~dp0
CALL :myfunction World
java.exe -cp  frames.FrameDriver
IF NOT ERRORLEVEL 0 (
  SET exitcode=1
) ELSE (
  SET exitcode=0
)
GOTO :END
:myfunction
ECHO Hello %~1
EXIT /B 0
:END
EXIT %exitcode%
注意:另外,您可以用3种不同的方式执行java程序:

  java.exe -cp  frames.FrameDriver
  CALL java.exe -cp  frames.FrameDriver
  cmd.exe /c java.exe -cp  frames.FrameDriver

这是非常关键的,因为Java命令可能会带着退出代码退出,为了将退出代码正确地传递给ERRORLEVEL变量,您需要使用上面的正确方法,这一点我不确定。

您之所以通过批处理文件执行此操作,而不是简单地通过
Runtime.exec
ProcessBuilder
直接运行target
java
命令,有什么特别的原因吗?主要是因为我的.bat文件复制了一个在Linux上运行的类似shell脚本,我现在不想改变它的设计。在生产中,我们的应用程序在Linux机器上运行。但是,我们的开发环境是Windows。请尝试将START替换为CALL。START正在创建一个新的外部进程,该进程不再连接或响应批处理文件。当然,同样的“挂起”也可能发生在通话中,但值得一试。还可以尝试@CALL(注意at符号)。当我使用“开始”时,挂起问题不再存在。当使用“开始”时,我猜我的java应用程序的退出代码是错误的。@MohammedSoueidane你怎么知道你的
frames.FrameDriver
何时退出?