【问题标题】:How to read error output stream in batch file?如何在批处理文件中读取错误输出流?
【发布时间】:2019-05-02 14:40:45
【问题描述】:

我有一个启动服务器的批处理脚本。 然后,该服务器将其日志打印到 STDOUT 和 STDERR 以防出错。

我想将 STDOUT 和 STDERR 都重定向到 tee 命令以拆分输出。 使用来自UnxUtilstee 命令效果很好。

但是,为了使我的应用程序可移植,我不能依赖 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
)

【问题讨论】:

标签: batch-file cmd stderr


【解决方案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

【讨论】:

  • 我知道 PowerShell 有这个命令,但是我不知道你可以在使用它的同时仍然在经典 cmd 中打印输出。非常感谢!
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2011-12-14
  • 2017-08-07
  • 2010-11-12
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多