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
您已经获得了将 STDOUT 和 STDERR 重定向到文件的正确代码:
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
) 的右侧命令。
现在我们要将左侧的 STDOUT 和 STDERR 都重定向到 STDIN右侧的。由于右侧没有任何变化,我们保持不变。但是左侧需要修改; STDOUT 已经到达我们想要的位置,但是 STDERR 还没有,所以我们必须将它重定向到 STDOUT 的目标,使用与输出重定向相同的表达式 (>
):
net use Z: \server\share 2>&1 | TimeStampPipe.exe >> logfile.txt
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
您已经获得了将 STDOUT 和 STDERR 重定向到文件的正确代码:
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
) 的右侧命令。
现在我们要将左侧的 STDOUT 和 STDERR 都重定向到 STDIN右侧的。由于右侧没有任何变化,我们保持不变。但是左侧需要修改; STDOUT 已经到达我们想要的位置,但是 STDERR 还没有,所以我们必须将它重定向到 STDOUT 的目标,使用与输出重定向相同的表达式 (>
):
net use Z: \server\share 2>&1 | TimeStampPipe.exe >> logfile.txt