有没有办法在Windows中的脚本持续时间内将stderr重定向到stdout?

时间:2009-05-01 18:04:35

标签: windows scripting batch-file build-automation

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

其中一个是我信赖的老'exec 2>& 1',在Bourne shell中,在脚本的持续时间内将stderr和stdout整合在一起,以便日志记录将捕获所有好的和坏的。

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

Windows环境中是否有任何等效内容?我们在这里使用.BAT文件脚本和Perl脚本(主要用于构建自动化以及其他一些东西),我非常想知道这是否可行。

6 个答案:

答案 0 :(得分:5)

在Perl中你可以做到

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

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

答案 1 :(得分:2)

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

这样的东西
rem log.bat
cmd /c work.bat 1>>logfile.log 2>&1
rem work.bat
make all
perl cleanups.pl

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

答案 2 :(得分:1)

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

(
echo 1
dir
echo 2
) >somefile.txt

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

答案 3 :(得分:0)

从MS阅读此KB article。取自上述文章的样本:

  

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

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

答案 4 :(得分:0)

2>&1似乎对我的脚本起作用了:

testcmd.cmd > stdboth.txt 2>&1

你究竟在做什么以及你在做什么期待什么?

答案 5 :(得分:0)

: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