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

发布于 2024-07-18 07:28:41 字数 340 浏览 6 评论 0原文

作为一名长期 UNIX shell 脚本编写者/发布工程师,我最近的工作全职进入 Windows 环境,有些事情我不可避免地会怀念。

其中之一是我值得信赖的旧“exec 2>&1”,它在 Bourne shell 中在脚本运行期间永久地将 stderr 和 stdout 结合在一起,以便日志记录将捕获所有好的和坏的东西。

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

Windows环境下有没有类似的东西? 我们在这里使用 .BAT 文件脚本和 Perl 脚本(主要用于构建自动化,但也用于其他一些事情),我非常想知道这是否可行。

As a long time UNIX shell scripter / release engineer coming into the Windows environment full time with my latest job, there are some things I inevitably miss.

One of them is my trusty old 'exec 2>&1' which in the Bourne shell permently knots together stderr and stdout for the duration of the script, so that logging will capture everything good and bad.

I realize you can append 2>foo.log to the end of every command line invocation, but I'm wondering if there's a better way.

Is there any equivalent in the Windows environment? We're using both .BAT file scripts and Perl scripts here (Mostly for build automation but also some other things) and I'd dearly love to know if this is possible at all.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

指尖微凉心微凉 2024-07-25 07:28:41

在 Perl 中,您可以

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

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

In Perl you can do

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

to redirect the STDERR output of the script to STDOUT. See the open documentation for more info. I wouldn't expect this to effect the output of system calls, i.e. system or backticks.

小姐丶请自重 2024-07-25 07:28:41

您可以将实际工作的 .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,我没有检查过。 如果这确实有效,那么解决方案可以是自包含的:只需使用额外的参数来调用自己,以指示日志记录有效并且流已重定向。

You can nest the .BAT that does the real work inside a .BAT that redirects the streams for logging.

Something like

rem log.bat
cmd /c work.bat 1>>logfile.log 2>&1
rem work.bat
make all
perl cleanups.pl

might do the trick. You might be able to use CALL instead of directly invoking a second CMD.EXE, I haven't checked. If that does work, then the solution can be self contained: just call yourself with an extra argument to indicate the logging is in effect and with the streams redirected.

撞了怀 2024-07-25 07:28:41

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

(
echo 1
dir
echo 2
) >somefile.txt

但请注意,无法在命令块内部使用标签和 goto。

You can apply redirection to command blocks as well as single commands

(
echo 1
dir
echo 2
) >somefile.txt

Note that it is impossible to use labels and goto inside of command blocks, though.

夕色琉璃 2024-07-25 07:28:41

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

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

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

Read this KB article from MS. Sample taken from the said article:

You can print the errors and standard output to a single file by using the "&1" command to redirect the output for STDERR to STDOUT and then sending the output from STDOUT to a file:

 dir file.xxx 1> output.msg 2>&1
他是夢罘是命 2024-07-25 07:28:41

2>&1 的事情似乎对我的脚本有用:

testcmd.cmd > stdboth.txt 2>&1

你到底在做什么以及当你这样做时你期待什么?

The 2>&1 thing seems to be working for me for scripts:

testcmd.cmd > stdboth.txt 2>&1

What exactly are you doing and what are you expecting when you're doing it?

迎风吟唱 2024-07-25 07:28:41
: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
:log_me
@if "%~1" NEQ "*" ("%~nx0" * >> "%~n0.log" 2>&1)

:script
echo this is success
echo this is error>&2

And, if your batch script has command line parameters:

:log_me
@call :script %* >> "%~n0.log" 2>&1
exit /b

:script
echo this is success
echo this is error>&2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文