如何读取批处理文件中的错误输出流?

时间:2019-05-02 14:40:46

标签: batch-file cmd stderr

我有一个启动服务器的批处理脚本。 然后,如果发生错误,该服务器会将其日志打印到STDOUT和STDERR。

我想将STDOUT和STDERR都重定向到tee命令以拆分输出。 使用UnxUtils中的tee命令,效果很好。

但是,为了使我的应用程序具有可移植性,我不能依赖UnxUtils,因此需要编写自己的tee命令。

我写了一个批处理脚本,它像this answer(2。代码块)中所建议的那样读出了STDOUT。

这有效,但仅适用于重定向的STDOUT,不适用于STDERR。

注意:文件和命令行中都缺少STDERR的输出。

如何让它读取两个流?

我如何重定向输出(%1是服务器,%2是我希望日志进入的文件)?

%1 2>&1 | %~dp0tee.bat -a %2

这工作正常(因为它调用UnxUtils,而不是我的批处理脚本):

%1 2>&1 | tee -a %2

我如何阅读tee.bat中的输入:

for /F "tokens=*" %%a in ('findstr /n $') do (
    set "line=%%a"
    setlocal EnableDelayedExpansion
    set "line=!line:*:=!"

    echo(!line!

    if %append%==true (
        echo(!line! >> %output%
    ) else (
        echo(!line! > %output%
    )
    endlocal
)

1 个答案:

答案 0 :(得分:1)

PowerShell具有一个Tee-Object cmdlet。 $Input变量接收标准输入。

echo asf 2>&1 | powershell -NoLogo -NoProfile -Command "$Input | Tee-Object -FilePath './tee.txt'"

另请参阅:https://stackoverflow.com/a/38668360/447901