【问题标题】:Redirect stdout and stderr from inside a batch file从批处理文件中重定向标准输出和标准错误
【发布时间】:2012-11-04 03:23:15
【问题描述】:

有没有办法从里面为批处理文件重定向标准输出和标准错误。

我在想象类似的东西

set STDOUT=stdout.log
echo Some text
a.exe
b.exe
c.exe

Some text 以及 a.exeb.exec.exe 的输出都将转到 stdout.log

这可能吗?

【问题讨论】:

    标签: batch-file stdout stderr


    【解决方案1】:

    是的,您需要将标准输出重定向并附加到您的文件 (1>> %STDOUT%) 并将标准错误连接到标准输出 (2>&1):

    set STDOUT=stdout.log
    echo Some text 1>> %STDOUT% 2>&1
    a.exe 1>> %STDOUT% 2>&1
    b.exe 1>> %STDOUT% 2>&1
    c.exe 1>> %STDOUT% 2>&1
    

    @EitanT 正确指出您的问题并不一定意味着将 stderr 和 stdout 都写入同一个文件。因此,为了完整起见,这是一个写入单独文件的版本:

    set STDOUT=stdout.log
    set STDERR=stderr.log
    echo Some text 1>> %STDOUT% 2>> %STDERR%
    a.exe 1>> %STDOUT% 2>> %STDERR%
    b.exe 1>> %STDOUT% 2>> %STDERR%
    c.exe 1>> %STDOUT% 2>> %STDERR%
    

    【讨论】:

    • +1:您不必将stderr 重定向到stdout...如果您愿意,可以将它们重定向到单独的日志。
    • 当然你不必这样做,但我认为他想这样做:...重定向stdout stderr...我>
    • 是的,将它们都重定向,但不一定要重定向到同一个位置。没关系,我只是在吹毛求疵...
    【解决方案2】:

    为整个命令集合重定向一次比重定向(附加)每个单独的命令更有效。初始化重定向需要时间。对于一些重定向的命令可能并不明显,但如果在循环中执行多次迭代,它可能会变得非常重要。

    一种方法是将整个重定向命令块括在括号内,并在括号外重定向

    >stdout.log 2>&1 (
      echo Some text
      a.exe
      b.exe
      c.exe
    )
    

    另一种选择是将您的命令放在子程序中并重定向 CALL

    call :redirect >stdout.log 2>&1
    exit /b
    
    :redirect
    echo Some text
    a.exe
    b.exe
    c.exe
    exit /b
    

    【讨论】:

    • 如何将日志文件名放入变量中?
    • 太棒了!请注意,第一种方法使用圆括号,右圆括号within 必须用插入符号^ 转义外部块。如果你通过管道输出,每个右括号需要三个插入符号——参见stackoverflow.com/a/12976840/550712
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多