如何评估从批处理文件中启动的应用程序的退出代码?

时间:2014-07-18 16:28:03

标签: batch-file

我正在尝试使用START命令从批处理文件执行应用程序(在执行时隐藏控制台),我需要在执行后获得错误级别。例如,在System.exit(10)之后,我想重新启动Java应用程序:

:while
START javaw ...
IF errorlevel 10 GOTO while     

但它不起作用,因为在java进程完成之前评估了errorlevel条件。

我还测试了下一个代码,但由于同样的原因,我得到一个空文本文件:

:while
start javaw ... >exit.txt 2>&1
set /p status=<exit.txt
if "%status%"=="10" goto :while  

然后,有没有办法启动Java应用程序,没有控制台(/ WAIT不是一个选项),并在出现问题时使用循环重新启动应用程序?

2 个答案:

答案 0 :(得分:1)

请参阅问题How to call a batch file in the parent folder of current batch file?上的答案,了解从批处理文件中运行应用程序或批处理文件的4种不同方法。

另见Difference between java/javaw/javaws

批处理文件的执行导致打开控制台窗口。

因此我建议简单地使用

:while
java.exe ... 
IF errorlevel 10 GOTO while

如果您不希望在批处理文件的控制台窗口中看到Java应用程序的任何输出,请使用以下代码:

:while
java.exe ... 1>nul 2>nul
IF errorlevel 10 GOTO while

1>nul将写入 stdout 的输出重定向到设备NUL,2>nul将写入 stderr 的错误消息重定向到设备NUL。

我能想到的唯一解决方案是运行Java应用程序而不显示控制台窗口并另外检查Java应用程序的成功执行是用C / C ++ / C#编写Windows(GUI)应用程序而不打开窗口与javaw.exe类似,并使用适当的参数运行javaw.exe作为评估返回码的过程。

但是对于批处理文件,就我所知,不可能完全避免打开控制台窗口。控制台窗口可以最小化打开,但不能完全隐藏。

答案 1 :(得分:0)

使用此解决方案:Windows batch assign output of a program to a variable您可以执行以下操作:

@echo off
:loop
application arg0 arg1 > temp.txt
set /p status=<temp.txt
if "%status%"=="10" goto :loop
echo "Done."