很长一段时间UNIX shell脚本编写/发布工程师在我的最新工作中全职进入Windows环境,有些事情我不可避免地会错过。
其中一个是我信赖的老'exec 2>& 1',在Bourne shell中,在脚本的持续时间内将stderr和stdout整合在一起,以便日志记录将捕获所有好的和坏的。
我意识到你可以将2> foo.log附加到每个命令行调用的末尾,但我想知道是否有更好的方法。
Windows环境中是否有任何等效内容?我们在这里使用.BAT文件脚本和Perl脚本(主要用于构建自动化以及其他一些东西),我非常想知道这是否可行。
答案 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