【问题标题】:Batch logging using interpolation使用插值进行批量记录
【发布时间】:2013-11-30 10:37:30
【问题描述】:

我不记得我是从哪里得到这个代码 sn-p 的,但它已经被处理了,但有一个缺点——它没有及时重定向 stderr!

@echo off
set logit=^> _ 2^>^&1 ^&^& type _^&^&type _^>^>script.log^&^&DEL /q _

REM "just stdout output" will be printed to STDOUT and logged properly
echo just stdout output %logit%

REM ls with spit out an error message to STDERR and will NOT be logged
ls %logit%

上面的代码基本上依赖于logit会被扩展来做以下事情:

  1. 将 STDOUT 发送到名为“_”的文件,同时将 STDERR 重定向到 STDOUT
  2. 在屏幕上输入文件“_”
  3. 在“script.log”文件中输入文件“_”
  4. 删除“_”文件

问题在于 STDERR 到 STDOUT 的重定向。我知道 2>&1 应该在命令行最后发生。 "&&" 连接以前必须在单独的行上的命令。因此,将 2>&1 放在第一个 && 出现之前是有意义的。然而,它不起作用。最后放 2>&1 也无济于事:

set lotit==^> _ ^&^& type _^&^&type _^>^>script.log^&^&DEL /q _ 2^>^&1

但是,按以下方式分解命令可以按预期工作:

@echo off

REM "just stdout output" will be printed to STDOUT and logged properly
echo just stdout output > _ 2>&1
type _&&type _>>script.log&&DEL /q _

REM ls with spit out an error message to STDERR and will NOT be logged
ls > _ 2>&1
type _&&type _>>script.log&&DEL /q _

有谁知道我可以使用带有 %logit% 扩展的原始示例将 STDERR 重定向到 STDOUT 的方法吗?

【问题讨论】:

  • 您应该删除DEL。它可能会在重定向完成之前尝试删除。它会生成另一个对磁盘的写访问。相反,只需在脚本的最后删除一次_。

标签: batch-file logging stdout stderr error-logging


【解决方案1】:

&& 是一个对错误级别为零的结果执行以下命令的运算符。单个& 正常执行下一个命令。

通过重定向,首先重定向 STDOUT,然后将 STDERR 重定向到 STDOUT。
看起来您的代码正在这样做。

错误级别可能为 1 或更高,因此下一个命令不会运行。
解决方案是将所有&& 更改为& 并在您的代码中将^&^& 更改为^&

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多