【发布时间】: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会被扩展来做以下事情:
- 将 STDOUT 发送到名为“_”的文件,同时将 STDERR 重定向到 STDOUT
- 在屏幕上输入文件“_”
- 在“script.log”文件中输入文件“_”
- 删除“_”文件
问题在于 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