作为一名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