10

我有一个执行 java 应用程序的批处理文件。我正在尝试对其进行修改,以便每当发生异常时,它都会将 STDERR 写入文件。

它看起来像这样:

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

有没有办法也可以将参数 %1 和 %2 写入 log.txt 文件?每次调用此批处理文件时,我都不想将其写入日志文件,只有在发生异常时才将其写入日志文件。

我尝试寻找一种将 STDERR 重定向到变量的方法,但我无法弄清楚。理想情况下,我希望日志文件看起来像:

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...
4

6 回答 6

3

像这样的东西可能会起作用:

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:将标准输出发送到 null (^>nul) 只会保留标准错误输出,设置为%%e

3:do部分中的任何事情只会发生,因为测试语句实际上有任何输出,即如果设置了%%e

话虽如此,您必须测试脚本并查看异常是否实际发送到stderr,或者像其他一些软件一样,即使发生错误也发送到stdout。

我希望这有帮助。

于 2009-08-25T17:07:44.647 回答
2

I don't get exactly what you are asking, but here's some info that may help...

You can redirect stderr separately from stdout in a .cmd or .bat file. To redirect stderr, use something like this:

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

Then, you can check the command.stderr.txt for content, and if any is present, concatenate it to the command.stdout.txt into your log file. Or you could concat it in any case. If you like you could also echo the command that you ran, into the final log file.

You can also check for the exit code in a batch file, using the %ERRORLEVEL% env var. Exe files are expected to set ERRORLEVEL in case of an error. I don't know if java.exe does this. It should, if it is a good citizen on Windows. This might be an alternative way of finding out if the Java app exited with an error condition. But this is no guarantee that stderr got nothing. For example, a Java app might print out an exception and stack trace, and then exit with code 0, which indicates success. In which case stderr would have gunk in it, but ERRORLEVEL would be zero.

EDIT: s/ERROR_LEVEL/ERRORLEVEL

于 2009-05-28T01:42:15.557 回答
2

我看到的唯一可行的解​​决方案是将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
)

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

参数:foo bar
一些常规输出
参数:foo2 bar2
更多输出
Blah 的 NullPointerException:我们真正想要在参数之后立即拥有的东西
Blah 处的 IOException:此异常属于参数 foo2 bar2

您可以使用另一个文件作为信号量来写入日志以避免批处理输出混合:copy nul file当您想要写入日志时创建文件 [],然后删除它,然后在您尝试创建它之前检查它是否真的存在并等到它消失。但是,您不能对混合到文件中的标准输出日志做任何事情,除非您也对标准输出使用该临时文件方法(并且只是type将标准输出日志记录到log.txtJava 程序完成时,但是,再次使用信号量。

于 2009-05-28T05:45:22.443 回答
0

Try using 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
于 2009-05-28T01:44:14.477 回答
0

像这样的东西怎么样(未经测试):

@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
于 2009-05-28T00:57:32.730 回答
0

像这样的批处理文件应该可以解决问题。

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

将标准错误重定向到标准输出

2>&1

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

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

将输出附加到"log.txt"

>>log.txt

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

这是我使用的两个文件"something.py""format_output.py"

东西.py

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

格式输出.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

最后是输出。

日志.txt

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

唯一缺少的是总是将某些内容写入“log.txt”文件。

为了进一步整理,我会将日志文件写入"format_output.py"

然后,您可以添加检查以查看程序中的 stderr 是否为空白。

于 2009-06-11T22:17:26.813 回答