Is there a way to redirect stderr to Stdout for the duration of a script in Windows?


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.

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

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.