我正在尝试使用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不是一个选项),并在出现问题时使用循环重新启动应用程序?
答案 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."