Batch file 从批处理文件内部重定向stdout和stderr

Batch file 从批处理文件内部重定向stdout和stderr,batch-file,stdout,stderr,Batch File,Stdout,Stderr,是否有一种方法可以从批处理文件中重定向stdout和stderr 我在想象这样的事情 set STDOUT=stdout.log echo Some text a.exe b.exe c.exe 其中某些文本,以及a.exe、b.exe和c.exe的输出将转到stdout.log 这可能吗?是的,您需要重定向并将标准输出附加到您的文件(1>%stdout%)中,并将标准输出连接到标准输出(2>&1): @EitanT正确地指出,您的问题并不一定意味着同时将stderr和stdout写入同一个文

是否有一种方法可以从批处理文件中重定向stdout和stderr

我在想象这样的事情

set STDOUT=stdout.log
echo Some text
a.exe
b.exe
c.exe
其中
某些文本
,以及
a.exe
b.exe
c.exe
的输出将转到
stdout.log


这可能吗?

是的,您需要重定向并将标准输出附加到您的文件(
1>%stdout%
)中,并将标准输出连接到标准输出(
2>&1
):

@EitanT正确地指出,您的问题并不一定意味着同时将stderr和stdout写入同一个文件。为了完整起见,这里有一个版本可以写入单独的文件:

set STDOUT=stdout.log
set STDERR=stderr.log
echo Some text 1>> %STDOUT% 2>> %STDERR%
a.exe 1>> %STDOUT% 2>> %STDERR%
b.exe 1>> %STDOUT% 2>> %STDERR%
c.exe 1>> %STDOUT% 2>> %STDERR%

对整个命令集合重定向一次比重定向(使用append)每个命令更有效。初始化重定向需要时间。对于一些重定向的命令,这可能不明显,但如果在循环中多次迭代,它可能变得非常重要

一种方法是将整个重定向命令块括在括号内,并在括号外重定向

>stdout.log 2>&1 (
  echo Some text
  a.exe
  b.exe
  c.exe
)
另一个选项是将命令放入子例程并重定向调用

call :redirect >stdout.log 2>&1
exit /b

:redirect
echo Some text
a.exe
b.exe
c.exe
exit /b

+1:您不必将
stderr
重定向到
stdout
。。。如果你想,你可以将它们重定向到单独的日志。当然你不必这样做,但我认为他想做的正是:…重定向stdout和stderr…是的,将它们都重定向到同一个位置。没关系,我只是吹毛求疵…把日志文件名放进变量的方法是什么?太棒了!注意,对于第一个使用括号的方法,必须使用插入符号^对外部块中的右括号进行转义。如果使用管道输出,每个右括号需要三个插入符号——请参阅。
call :redirect >stdout.log 2>&1
exit /b

:redirect
echo Some text
a.exe
b.exe
c.exe
exit /b