如何使用wintee仅重定向STDERR?

时间:2016-10-05 21:06:52

标签: windows batch-file cmd io-redirection

我目前正在使用wintee来记录测试脚本的结果消息。这是命令的样子:

test_name.bat [parameters] 2>&1 | wtee log.txt

但是,我只想将STDERR归档到一个文件,同时仍然向控制台显示STDOUT和STDERR。问题出现在wintee的限制中:它似乎只分叉STDIN,STDOUT和输入文件。

这是我正在尝试做的事情:

  1. 将STDOUT重定向到流3(未使用的流)
  2. 将STDERR重定向到STDOUT
  3. 将流3(重定向的STDOUT)重定向到STDERR
  4. 这样,控制台仍会显示两个流的消息,而wintee只会从(最初的)STDERR中分叉消息。

    但是,我不确定是否可能,因为我对流重定向的理解很浅。我试图看看我是否可以使用另一个流将STDOUT重定向到STDERR:

    echo Hello World! 3>&2 >3
    

    但是,它没有打印任何东西。

    我是否正在尝试以原生批次完成(可选择使用其他工具的帮助)?如果是这样,我做错了什么?

2 个答案:

答案 0 :(得分:2)

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout   
On Error Resume Next

Set Fso = CreateObject("Scripting.FileSystemObject")
Set File = Fso.CreateTextFile(Arg(0), True)
If err.number <> 0 then
    Outp.WriteLine "Error: " & err.number & " " & err.description & " from " & err.source
    err.clear
    wscript.exit
End If
Do Until Inp.AtEndOfStream
    Line=Inp.readline
    outp.writeline Line
    File.WriteLine Line
Loop

这个Tees StdOut。将第4行更改为Set Outp = Wscript.Stderr将使其成为Tee StdErr。

使用dir | cscript //nologo Tee.vbs

答案 1 :(得分:0)

我不知道wintee命令,但我想我可以帮你解决重定向问题:

而不是test_name.bat [parameters] 2>&1 | wtee log.txt,您应该写下以下内容:

(test_name.bat [parameters] 2>&1 1> con) | wtee log.txt

这会将 STDOUT 中的文本写入控制台,将 STDERR 中的数据重定向到 STDOUT ,然后将其传递给{ {1}}命令。

请注意,控制台会在任何 STDERR 数据之前显示所有原始 STDOUT ,因为前者会立即显示,而后者会通过wtee传递。使用纯重定向黑客,无法保留返回数据的原始顺序。 如果您坚持这一点,则需要使用具有所需功能的wtee以外的工具。 编辑: 在特别是,管道是瓶颈,因为只有一个通道,即 STDIN ,它将数据传递给。因此,如果您坚持以原始顺序显示 STDOUT SRDERR 数据,同时将一个流的数据保存到文件中,则除了修改之外别无选择脚本wintee并避免管道。

我试图解释使用管道左侧的命令test_name.bat,它在 STDOUT STDERR 处产生输出(因为无效路径dir ":"):

":"

STDERR 上显示D:\Data> dir ":" Volume in drive D has no label. Volume Seriel Number is 0000-0000 Directory of D:\Data File Not Found 消息,而其余消息显示在 STDOUT (您可以通过重定向File Not Found或{{ 1}}解除其中一个流。)

在管道的右侧,我使用命令2> nul,它只是传递它在 STDIN 处收到的所有数据,并在控制台上显示它:

1> nul

控制台输出的更改顺序说明了发生的情况: STDERR 立即显示,而 STDOUT 在显示之前首先通过管道。

现在让我们从命令行应用重定向find /V ""

D:\Data> dir ":" | find /V ""
File Not Found
 Volume in drive D has no label.
 Volume Seriel Number is 0000-0000

 Directory of D:\Data

这会将 STDERR 重定向到 STDOUT ,因此原始的 STDOUT 数据与重定向的数据一起通过管道传输。用2>&1替换D:\Data> (dir ":" 2>&1) | find /V "" Volume in drive D has no label. Volume Seriel Number is 0000-0000 Directory of D:\Data File Not Found 证明管道的右侧确实接收了所有数据。

现在让我们添加find /V ""部分,它构成 STDOUT 到控制台的显式重定向:

(> nul find /V "")

输出包含所有原始数据。再次将1> con替换为D:\Data> (dir ":" 2>&1 1> con) | find /V "" Volume in drive D has no label. Volume Seriel Number is 0000-0000 Directory of D:\Data File Not Found 证明了这一次,管道的右侧确实只接收了find /V ""消息,该消息最初出现在 STDERR ,但是 STDOUT 数据不会通过管道传输。

只是旁注:
如果您想使用纯执行(> nul find /V "")之类的操作,事情会变得非常复杂 - 请参阅this example ...