【问题标题】:Is there a way to redirect stderror to stdout for the duration of a script in Windows?有没有办法在 Windows 中的脚本期间将 stderr 重定向到 stdout?
【发布时间】:2009-05-01 18:04:35
【问题描述】:

作为一名长期从事 UNIX shell 脚本编写者/发布工程师,在我的最新工作中全职进入 Windows 环境,我不可避免地会错过一些事情。

其中一个是我值得信赖的旧 'exec 2>&1',它在 Bourne shell 中在脚本执行期间永久地将 stderr 和 stdout 结合在一起,以便日志记录将捕获所有好的和坏的。

我知道您可以在每个命令行调用的末尾附加 2>foo.log,但我想知道是否有更好的方法。

在 Windows 环境中是否有任何等价物?我们在这里同时使用 .BAT 文件脚本和 Perl 脚本(主要用于构建自动化,但也用于其他一些事情),我非常想知道这是否可行。

【问题讨论】:

  • 你可能是指 2>>foo.log 那里。几年前的一个晚上,那个小失误导致了相当多的脱发......

标签: windows scripting batch-file build-automation


【解决方案1】:

在 Perl 中你可以这样做

open STDERR, '>&STDOUT' or die "Can't dup STDOUT";

将脚本的 STDERR 输出重定向到 STDOUT。有关详细信息,请参阅 open 文档。我不希望这会影响系统调用的输出,即system 或反引号。

【讨论】:

  • 它确实会影响系统调用和反引号的输出。这些子进程在调用它们时获得在 Perl 中打开的任何 STDIN、STDOUT 和 STDERR 句柄。
【解决方案2】:

您可以将执行实际工作的 .BAT 嵌套在重定向流以进行日志记录的 .BAT 中。

类似

远程日志.bat cmd /c work.bat 1>>logfile.log 2>&1 远程工作.bat 做所有 perl cleanups.pl

可能会成功。您可能可以使用 CALL 而不是直接调用第二个 CMD.EXE,我还没有检查过。如果这确实有效,那么解决方案可以是自包含的:只需使用一个额外的参数调用您自己,以指示日志记录有效并且重定向流。

【讨论】:

    【解决方案3】:

    您可以将重定向应用于命令块以及单个命令

    (
    echo 1
    dir
    echo 2
    ) >somefile.txt
    

    但请注意,在命令块内不能使用标签和 goto。

    【讨论】:

      【解决方案4】:

      从 MS 那里阅读KB article。摘自上述文章的样本:

      您可以将错误和标准输出打印到单个文件中,方法是使用“&1”命令将 STDERR 的输出重定向到 STDOUT,然后将输出从 STDOUT 发送到文件:

       dir file.xxx 1> output.msg 2>&1
      

      【讨论】:

      • 谢谢,但我认为您没有阅读问题。我知道我可以为每个命令调用重定向 stdout 和 stderr,我想要做的是在脚本期间执行重定向。
      • 我的意思是:我认为将上述内容与脚本一起使用没有任何问题。但是,AFAIK,批处理文件没有特殊的 STDERR。
      【解决方案5】:

      2>&1 似乎对我的脚本有用:

      testcmd.cmd > stdboth.txt 2>&1
      

      你到底在做什么,你在做什么时期望什么?

      【讨论】:

      • 谢谢,但正如我在问题中所说,我正在寻找可以将 stderr 重定向到 整个脚本 的 stdout 的东西 - 而不仅仅是单个命令调用。
      • 我不确定你所说的“整个脚本”是什么意思 - 在上面的示例中,stdout 和 stderr 似乎被重定向到 testcmd.cmd 脚本中的所有命令(以及它调用的任何脚本) .脚本中的命令不需要修改。
      【解决方案6】:
      :log_me
      @if "%~1" NEQ "*" ("%~nx0" * >> "%~n0.log" 2>&1)
      
      :script
      echo this is success
      echo this is error>&2
      

      而且,如果你的批处理脚本有命令行参数:

      :log_me
      @call :script %* >> "%~n0.log" 2>&1
      exit /b
      
      :script
      echo this is success
      echo this is error>&2
      

      【讨论】:

        猜你喜欢
        • 2019-06-21
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2015-09-02
        • 2022-01-18
        • 2011-07-16
        相关资源
        最近更新 更多