【问题标题】:Windows Redirect STDERR and STDOUT to same program when pipingWindows 在管道时将 STDERR 和 STDOUT 重定向到同一程序
【发布时间】:2020-09-26 17:57:39
【问题描述】:

MSDNthis 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


【解决方案1】:

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

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) 当前是(re -)针对。该表达式的位置至关重要。


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

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

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

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2012-08-07
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多