Windows 管道时将 STDERR 和 STDOUT 重定向到同一程序

Windows Redirect STDERR and STDOUT to same program when piping

MSDN and this question 给出重定向 Windows cmd stdout 和 stderr 到单个文件的例子:

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

当 STDERR 和 STDOUT 通过管道传输到另一个程序时,我希望做同样的事情。这是没有 STDERR 重定向的用法:

net use Z: \server\share  |  TimeStampPipe.exe >> logfile.txt 

我希望 "net use" 的 STDERR 和 STDOUT 通过管道传输到 TimeStampPipe.exe。我不关心来自 TimeStampPipe.exe 的 STDERR。 2>&1 去哪里表明它适用于网络使用而不是 TimeStampPipe.exe?我试过这个

net use Z: \server\share  1> 2>&1 TimeStampPipe.exe >> logfile.txt 

得到了2>&1 was unexpected at this time.

我试过了

net use Z: \server\share  1| 2|&1 TimeStampPipe.exe >> logfile.txt 

得到了& was unexpected at this time.

管道时有没有办法做到这一点?我可以尝试类似的方法:

net use Z: \server\share  1> tempfile.txt 2>&1
type tempfile.txt | TimeStampPipe.exe >> logfile.txt 
del tempfile.txt

有没有更简洁的方法?

编辑:我尝试了@compo 的建议,单独使用 2>&1。我尝试了这三种形式:

net use Z: \server\share  | 2>&1 TimeStampPipe.exe >> logfile.txt 
net use Z: \server\share  |  TimeStampPipe.exe 2>&1 >> logfile.txt 
net use Z: \server\share  | TimeStampPipe.exe >> logfile.txt 2>&1

在每种情况下,stdout 都通过管道正确传输,但是来自 net use 的任何 stderr 输出都会进入屏幕,而不是通过管道。

正如其他人已经在评论中指出的那样,您必须这样做:

net use Z: \server\share 2>&1 | TimeStampPipe.exe >> logfile.txt

您已经获得了将 STDOUTSTDERR 重定向到文件的正确代码:

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

等同于:

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

因为输出重定向 (>) 默认从 STDOUT(处理 1)读取。

表达式 2>&1 定义句柄 2 (STDERR) 将被重定向到句柄 1 (STDOUT) 当前(重新)定向到。该表达式的位置至关重要。


对于管道 (|),您必须应用相同的技术。请记住,管道将左侧命令的输出(在 STDOUT,句柄 1)重定向到输入(在 STDIN , 句柄 0) 的右侧命令。

现在我们要将左侧的 STDOUTSTDERR 都重定向到 STDIN右侧的。由于右侧没有任何变化,我们保持不变。但是左侧需要修改; STDOUT 已经到达我们想要的位置,但是 STDERR 还没有,所以我们必须将它重定向到 STDOUT 的目标,使用与输出重定向相同的表达式 (>):

net use Z: \server\share 2>&1 | TimeStampPipe.exe >> logfile.txt