【发布时间】:2020-09-26 17:57:39
【问题描述】:
MSDN 和 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
我希望将“网络使用”的 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 输出都会进入屏幕,而不是通过管道。
【问题讨论】:
-
如果您考虑一下,StdOut 通常不需要专门为管道重定向,是吗?因此,当您想要包含 StdErr 时,您只需添加它自己。因此,我只提供
2>&1,(即将句柄 2 发送到句柄 1 所在的任何位置),而不是1> 2>&1 -
这是有道理的,但不起作用。有关我尝试过的格式,请参见上文。在所有情况下,stderr 都会进入屏幕(cmd 窗口),而不是管道。
-
你试过
net use Z: \\server\share 2>&1 | TimeStampPipe.exe >>logfile.txt吗?你想要来自net use命令的 STDERR,对吧? -
对不起tim11g,我认为很明显,当我说管道重定向时,重定向要在管道之前执行!请查看@SomethingDark 的comment above 了解我的意思。
-
是的,就是这样。我遵循将
2>&1放在有效重定向之后的文章中的模式,但显然在管道必须先出现的情况下。
标签: windows batch-file cmd stdout stderr