将批量stderrredirect到文件

我有一个执行Java应用程序的batch file。 我试图修改它,以便每当发生exception时,它会将STDERR写入文件。

它看起来像这样:

start java something.jar method %1 %2 2>> log.txt 

有没有一种方法可以将参数%1和%2写入log.txt文件? 我不想每次调用这个batch file的时候都把它写到日志文件中,只有在发生exception的时候。

我试图寻找一种方法将STDERRredirect到一个variables,但我无法弄清楚。 理想情况下,我希望日志文件看起来像这样:

 Batch file called with parameters: - "first arg" - "second arg" Exception: java.io.exception etc... ------------------------------------ Batch file called with parameters: - "first arg" - "second arg" Exception: java.io.exception etc... 

Solutions Collecting From Web of "将批量stderrredirect到文件"

像这样的东西可能会工作:

javastart.cmd

 @echo off set params=%* for /f "delims=" %%e in ('java something.jar method %1 %2 ^>nul') do ( echo Batch file called with parameters:>>log.txt echo - Args[]: %*>>log.txt echo - Arg[1]: %1>>log.txt echo - Arg[2]: %2>>log.txt echo Exception: %%e ) 

我不是一个Java程序员,我不能测试这个输出/情况,但是:

1: %*表示每个参数,从第一个到最后一个(甚至是%12,尽管它不是直接可用的)。 可能比使用这个更好地划定那些。 即使不好的间距/引用,你也会有完整的参数。 我在日志中添加了一行,以显示完整的行然后参数。 如果这是一个糟糕的论点,你可以看到问题出在哪里。

2:将stdout发送到null(^> nul)将只保留stderr输出,设置为%% e

3:无论做什么都只会发生是测试语句实际上有任何作为输出,即如果%% e设置。

说这些,你必须测试脚本,看看是否实际发送到stderr,或者像其他一些软件一样,即使发生了错误,stdout也是如此。

我希望这有帮助。

我看到的唯一工作解决方案是将stderr重定向到一个临时文件

 java blah.jar %1 %2 2>stderr 

然后查看是否写入了文件并写入日志。

 for %%i in (stderr) do if %%~zi GTR 0 ( echo Parameters: %1 %2 >>log.txt type stderr >> log.txt ) 

如果批次不是按顺序运行,而是需要同时找到一些东西来分解temp变量:

 set file=%time::=% set /a file=file set file=%file%%random% java blah.jar %1 %2 2>stderr_%file% for %%i in (stderr) do if %%~zi GTR 0 ( echo Parameters: %1 %2 >>log.txt type stderr >> log.txt ) 

这将避免多个运行批次之间的冲突。 但是,当前没有使用任何东西来锁定写入日志文件,并且在写入其他东西时可能会出现不适合的情况(其他批处理可能会在echotype命令中交错,或者在重定向输出到该文件的Java,那么它可能会混淆java程序的常规输出:

参数:foo bar
有些经常输出
参数:foo2 bar2
更多的输出
 Blah中的NullPointerException:我们真正想要的参数后面
 Blah的IOException:这个异常属于参数foo2 bar2

您可以使用另一个文件作为信号来写入日志,以避免批输出混合:创建文件[ copy nul file ],当你想写入日志,删除它,然后再尝试创建它检查是否它实际上是在那里,等到它消失。 但是,除了将标准输出日志用于标准输出(也可以在Java程序结束时将标准输出日志输入到log.txt ,不能对标准输出日志进行任何操作。使用信号量。

我不明白你在问什么,但是这里有一些信息可能有帮助…

您可以将stderr从.cmd或.bat文件中的stdout单独重定向。 要重定向stderr,请使用如下所示的内容:

 MyCommand.exe > command.stdout.txt 2> command.stderr.txt 

然后,你可以检查command.stderr.txt的内容,如果有的话,将它连接到你的日志文件中的command.stdout.txt。 或者你可以在任何情况下连接。 如果你喜欢,你也可以将你运行的命令回显到最终的日志文件中。

您还可以使用%ERRORLEVEL%env var来检查批处理文件中的退出代码。 如果出现错误,预计将会设置exe文件来设置ERRORLEVEL。 我不知道如果java.exe这样做。 它应该,如果它是一个在Windows上的好公民。 这可能是查找Java应用程序是否退出且出现错误情况的替代方法。 但是这并不能保证stderr一无所获。 例如,Java应用程序可能会打印出异常和堆栈跟踪,然后以代码0退出,这表示成功。 在这种情况下,stderr会在其中产生垃圾,但ERRORLEVEL将为零。

编辑 :s / ERROR_LEVEL /错误级别

这样的事情怎么样(未经测试):

 @echo off @echo Batch file called with parameters: >> log.txt @echo - %1 >> log.txt @echo - %2 >> log.txt start java something.jar method %1 %2 2>> log.txt 

尝试使用ERRORLEVEL

 java something.jar method %1 %2 2>> log.txt IF %ERRORLEVEL% NEQ 0 GOTO Error Error: @ECHO There was an error @ECHO Arg 1: %1 >> log.txt @ECHO Arg 2: %2 >> log.txt 

像这样的批处理文件应该可以做到。

start_prog.cmd

 CALL :Start_Prog arg1 arg2 GOTO :EOF :Start_Prog something.py %1 %2 2>&1 1>nul | "C:\Python26\python.exe" format_output.py %1 %2 >>log.txt GOTO :EOF 

在这里,我通过管道传递stderr并将参数作为参数传递。 输出然后被附加到一个log.txt文件。

扔掉标准输出

 1>nul 

将stderr重定向到stdout

 2>&1 

将stderr管入脚本来格式化输出,并将参数作为参数传递。

 | "C:\Python26\python.exe" format_output.py %1 %2 

将输出附加到“log.txt”

 >>log.txt 

在我的系统上,我需要调用python.exe,否则管道不起作用。

这里是我使用“something.py”“format_output.py”的两个文件。

something.py

 import sys print >>sys.stdout, " ".join(sys.argv[1:]) print >>sys.stderr, "java.io.exception etc..." 

format_output.py

 import sys print "Batch file called with parameters:" for arg in sys.argv[1:]: print '- "{0}"'.format(arg) print "Exception:" for line in sys.stdin: print line 

最后是输出。

log.txt的

 Batch file called with parameters: - "arg1" - "arg2" Exception: java.io.exception etc... 

缺少的唯一东西是总是写入“log.txt”文件。

为了进一步整理,我将把日志文件写入“format_output.py”

然后你可以添加一个检查来查看你的程序中的stderr是否为空。