有没有办法在Windows中脚本的持续时间将stderrorredirect到标准输出?

作为一名UNIXshell脚本​​编写人员/发行工程师,在我最近的工作中全职进入Windows环境,有一些事情我不可避免地想念。

其中之一就是我可靠的老'exec 2&1',它在Bourne shell中在剧本的持续时间内将它们组合在一起,使得logging将捕捉好坏的一切。

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

Windows环境中是否有任何等价物? 我们在这里使用.BAT文件脚本和Perl脚本(主要是为了构build自动化,还有一些其他的东西),我非常想知道这是否可能。

你可以在.BAT中嵌套真正的工作,重定向日志记录。

就像是

 rem log.bat
 cmd / c work.bat 1 >> logfile.log 2>&1
 rem work.bat
使所有
 perl cleanups.pl

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

在Perl中你可以做

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

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

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

 ( echo 1 dir echo 2 ) >somefile.txt 

请注意,尽管可以使用标签并跳转到命令块中。

阅读这篇来自MS的知识库文章 。 来自上述文章的样本:

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

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

2>&1东西似乎是为我的脚本工作:

 testcmd.cmd > stdboth.txt 2>&1 

你到底在做什么?你在做什么?

 :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